2016-04-04 4 views
2

Im Moment versuche ich diese Abfrage mit eloquent:Laravel Pass Wert zu modellieren

'MentorId' => $employee->intern(true)->mentor(true)->MentorId, 

Und in meinem employee und intern Modell, das ich dies habe:

Intern

/** 
    * @return mixed 
    */ 
    public function intern($withTrashed = false) 
    { 
     if($withTrashed == true) 
     { 
      return $this->belongsTo(internModel::class, 'InternId')->withTrashed(); 
     } 

     return $this->belongsTo(internModel::class,'InternId'); 
    } 

Mentor

/** 
    * @return mixed 
    */ 
    public function mentor($withTrashed = false) 
    { 
     if($withTrashed == true) 
     { 
      return $this->belongsTo(mentorModel::class, 'MentorId')->withTrashed(); 
     } 

     return $this->belongsTo(mentorModel::class,'MentorId'); 
    } 

Aber es stürzt ab:

BadMethodCallException in Builder.php line 2148: 
Call to undefined method Illuminate\Database\Query\Builder::mentor() 

Wie könnte ich dieses Problem beheben?

--EDIT--

Mitarbeiter

<?php 

namespace App\src\employee; 

use Illuminate\Foundation\Auth\User as Authenticatable; 
use App\src\department\Department as departmentModel; 
use App\src\employee\Employee as employeeModel; 
use Illuminate\Database\Eloquent\SoftDeletes; 
use App\src\intern\Intern as internModel; 
use App\src\mentor\Mentor as mentorModel; 
use App\src\employee\Role as roleModel; 

class Employee extends Authenticatable 
{ 
    use SoftDeletes; 
    use EmployeeServiceTrait; 

    /** 
    * table name 
    */ 
    protected $table = 'employee'; 

    /** 
    * Mass assignment fields 
    */ 
    protected $fillable = ['RoleId', 'DepartmentId', 'InternId', 'FirstName', 'LastName', 'Bio','api_token', 'email', 'LinkedIn', 'password', 'Address', 'Zip', 'City', 'ProfilePicture', 'BirthDate', 'StartDate', 'EndDate', 'Suspended','LinkedIn']; 

    /** 
    * Primarykey 
    */ 
    protected $primaryKey = 'EmployeeId'; 

    /** 
    * Deleted_at 
    */ 
    protected $dates = ['deleted_at']; 

    /** 
    * @return mixed 
    */ 
    public function role() 
    { 
     return $this->belongsTo(roleModel::class,'RoleId'); 
    } 

    /** 
    * @return mixed 
    */ 
    public function intern($withTrashed = false) 
    { 
     if($withTrashed == true) 
     { 
      return $this->belongsTo(internModel::class, 'InternId')->withTrashed(); 
     } 

     return $this->belongsTo(internModel::class,'InternId'); 
    } 

    /** 
    * @return mixed 
    */ 
    public function department() 
    { 
     return $this->belongsTo(departmentModel::class,'DepartmentId'); 
    } 

    /** 
    * @return mixed 
    */ 
    public function mentor() 
    { 
     return $this->belongsTo(mentorModel::class,'MentorId'); 
    } 

    /** 
    * @return mixed 
    */ 
    public function employees() 
    { 
     return $this->hasManyThrough(employeeModel::class,departmentModel::class,'CompanyId','DepartmentId'); 
    } 

    /** 
    * @param $role 
    * @return bool 
    */ 
    public function hasRole($role) 
    { 
     if(strtolower($this->role->RoleName) == strtolower($role)) 
     { 
      return true; 
     } 
     return false; 
    } 
} 
+1

Haben Sie die Beziehungen haben in Ihrem Mitarbeitermodell vorgezeichnet? – Frisbetarian

+0

@Fribetarian was meinst du? – Jamie

+0

Sie müssen die Beziehungen definieren, die Mitarbeiter mit Mentor und Intern hat. – Frisbetarian

Antwort

1

Das Problem, das Sie haben, ist, dass jedes redegewandte Beziehungsobjekt tatsächlich eine Instanz von Relation ist. Dies bedeutet, dass beim Erstellen von Beziehungen tatsächlich eine Sammlung zurückgegeben wird (Instanz Builder); Hense Ihr Fehler:

BadMethodCallException in Builder.php line 2148: Call to undefined method Illuminate\Database\Query\Builder::mentor()

Die einfache Lösung, ohne Änderungen an der Code wäre so etwas wie:

'MentorId' => $employee->intern(true)->first()->mentor(true)->first()->MentorId; 

Sie können jedoch wie folgt verwenden Überlastung:

'MentorId' => $employee->intern->mentor->MentorId; 

Obwohl dies wird NICHT enthalten Ihre withTrashed. Sie können Ihre Beziehung zu so etwas wie aber zwicken:

public function intern($withTrashed = false) 
{ 
    $relation = $this->belongsTo(internModel::class, 'InternId'); 

    if($withTrashed == true) 
    { 
     return $relation->withTrashed()->first(); 
    } 

    return $relation->first(); 
} 

Aber ich würde nicht raten, denn später, wenn Sie Dinge wie WhereHas versuchen wird bereitet Sie Fehlermeldungen erhalten.Das heißt, wäre eine andere Art und Weise etwas in den folgenden Zeilen zu tun:

public function intern() 
{ 
    return $this->belongsTo(internModel::class, 'InternId'); 
} 

Dann wie trashed erhalten:

'MentorId' => $employee->intern()->withTrashed()->first()->mentor()->withTrashed()->first()->MentorId; 
+0

Vielen Dank, dass Sie meinen Tag gerettet haben! – Jamie

1

wie unten Versuchen Sie, wie pro laravel Führer. Denken Sie daran, dass das Elternmodell die Methode hasOne/hasMany und das Kindmodell die Methode belongsTo haben muss.

Intern

/** 
* @return mixed 
*/ 
public function intern($withTrashed = false) 
{ 
    if($withTrashed == true) 
    { 
     return $this->hasOne('App\Intern', 'InternId')->withTrashed(); 
    } 

    return $this->hasOne('App\Intern','InternId'); 
} 

Mitarbeiter

/** 
* @return mixed 
*/ 
public function intern($withTrashed = false) 
{ 
    if($withTrashed == true) 
    { 
     return $this->belongsTo('App\Intern', 'InternId')->withTrashed(); 
    } 

    return $this->belongsTo('App\Intern','InternId'); 
} 

Hinweis: Das Gleiche gilt für alle anderen Modelle.

+0

Danke, aber es funktioniert nicht. Erhalten Sie immer noch den Fehler: Aufruf an undefinierte Methode Illuminate \ Database \ Query \ Builder :: mentor() – Jamie

+0

@jamie, wenn 'Intern' Ihre Elternklasse ist, dann' hasOne' anstelle von 'belongsTo' verwenden –

Verwandte Themen