2017-05-09 58 views
0

假設我有一個Course模式是這樣的:使用關係

class Course extends Model 
{  
     public $primaryKey = 'course_id'; 

     protected $appends = ['teacher_name']; 

     public function getTeacherNameAttribute() 
     { 
      $this->attributes['teacher_name'] = $this->teacher()->first()->full_name; 
     } 

     public function teacher() 
     { 
      return $this->belongsTo('App\User', 'teacher', 'user_id'); 
     } 
} 

而在另一方面是有User模式是這樣的:

class User extends Authenticatable 
{ 

     public $primaryKey = 'user_id'; 

     protected $appends = ['full_name']; 

     public function getFullNameAttribute() 
     { 
      return $this->name . ' ' . $this->family; 
     } 

     public function course() 
     { 
      return $this->hasMany('App\Course', 'teacher', 'user_id'); 
     } 

} 

正如你所看到的那些之間有一個hasMany關係。

用戶模型中有一個full_name訪問器。

現在我想一個teacher_name訪問添加到使用它的teacher關係,並得到老師的full_name並追加到Course總是Course模型。

事實上,我希望每當打電話給Course模型時,都會將其中的教師名稱與其他屬性一起使用。

但每一次,叫場模型時,我得到這個錯誤:

exception 'ErrorException' with message 'Trying to get property of non-object' in D:\wamp\www\lms-api\app\Course.php:166 

這是指這條線課程模式:

$this->attributes['teacher_name'] = $this->teacher()->first()->full_name; 

我不知道我該怎麼解決這和什麼問題確切。

+0

'$這個 - >老師() - > first()',我想知道,它是否需要' - > first()'或不。 –

+0

它沒有。 '$ this-> teacher-> full_name'將會訣竅。 –

回答

0

$this->attributes['teacher_name'] = $this->teacher()->first()->full_name;

應該

$this->attributes['teacher_name'] = $this->teacher->full_name;

第一件事就是要引用的關係,所以鬆支架(),並因爲這種關係是belongsTo,你將有一個用戶/老師回來了。所以你不需要first()

我們還沒有看到你的領域可能是你將不得不改變:

return $this->belongsTo('App\User', 'teacher', 'user_id');

return $this->belongsTo('App\User', 'foreign_key', 'other_key');

其中foreign_keyother_key是您需要的主鍵加入。

檢查從文檔此鏈接以供參考: https://laravel.com/docs/5.4/eloquent-relationships#one-to-many-inverse

+0

我試過你的解決方案。但是在調用課程模型時,返回:'{ 「course」:{ 「teacher_name」:null, 「course_teacher」:null } }' –

+0

這隻能表示兩件事。無論是「課程」還是沒有定義「老師」。或者關係定義是錯誤的。 –

+0

我確定'foreign_key'和'other_key'是正確的,但我不知道爲什麼返回'null' –

0

做到這一點,正確的方法是:

課程

public function setTeacherNameAttribute() 
{ 
    $this->attributes['teacher_name'] = $this->teacher->full_name; 
} 
+0

真的嗎?爲什麼'設置....屬性'? –

+0

,因爲你正在定義屬性的值..沒有提取..如果你提取然後只是'返回$ this-> teacher-> full_name;' – Demonyowh