2017-05-19 80 views
-1

在這裏遇到一些Laravel問題。laravel addEagerConstraints hasOne

我有3種型號:

通知

  • ID
  • 消息
  • SENDER_ID
  • recipient_id
  • 等。

參與者

  • ID
  • USER_ID
  • 等。

用戶

  • ID
  • 名稱
  • 等。

通知可以具有發送器(SENDER_ID)和接收方(recipient_id)都引用到參與者表。 參與者具有對用戶(user_id)的引用。

我正嘗試使用下面的代碼獲取發件人和收件人的通知列表。

public function sender() 
{ 
    return $this->hasOne('App\Models\Participant', 'sender_id', 'id')->with(['user']); 
} 

public function recipient() 
{ 
    return $this->hasOne('App\Models\Participant', 'id', 'recipient_id')->with(['user']); 
} 

這將返回空結果 [關係:保護] =>數組 ( [發送方] => [接收者] => )

當改變的代碼:

public function sender() 
{ 
    return $this->hasOne('App\Models\Participant', 'sender_id', 'id')->with(['user'])->first(); 
} 

public function recipient() 
{ 
    return $this->hasOne('App\Models\Participant', 'id', 'recipient_id')->with(['user'])->first(); 
} 

我收到一個

「調用未定義的方法Illuminate \ Database \ Query \ Builder :: addEagerConstraints()」

+0

首先,爲什麼你有兩個函數的收件人()? –

+0

犯了一個錯誤,我糾正了第一篇文章。 – quibuz

回答

0

您的關係設置不正確。由於notifications表具有外鍵(sender_idrecipient_id),所以說Notification屬於Participant,並且Participant具有一個或多個Notification

你需要更新你的Notification模型關係是belongsTo關係:

public function sender() 
{ 
    return $this->belongsTo(Participant::class); 
} 

public function recipient() 
{ 
    return $this->belongsTo(Participant::class); 
} 

一對夫婦的注意事項:

  1. 既然你沒有顯示你的參與者/用戶關係,使確定它被定義爲「參與者屬於一個用戶,用戶有一個或多個參與者」。這就是你的數據庫設置的方式。

  2. 您在第二次嘗試中遇到的錯誤(「調用未定義的方法」)是因爲關係方法必須返回Relation實例。通過調用first(),你實際上正在執行查詢並返回一個不允許的Model

+0

謝謝!這就是訣竅! – quibuz

0

首先,保持模型更清潔,並在其中寫入關係邏輯。

public function sender() 
{ 
    return $this->hasOne('App\Models\Participant'); 
} 
public function recipient() 
{ 
    return $this->hasOne('App\Models\Participant'); 
} 

現在,在你的控制器,你寫的邏輯:

$sender = YourModel::sender()->where('sender_id', $id)->first(); 

希望這有助於。

+0

嗨坦維爾,不太關注你在這裏。 參與者模式沒有sender_id。通知模式確實;作爲參與者模態的參考。 關於清潔modals:如果需要一個通知列表與兩個發件人作爲收件人我可能會想要這個權利: 通知::與(['發件人','收件人'])? 在這種情況下,我希望我的模態也是正確的。 – quibuz