2015-10-26 35 views
2

我有一個雄辯的查詢,我沒有得到預期的結果,我希望有人可以向我解釋什麼是編寫查詢的正確方法。Laravel雄辯或無法遷移不會返回預期結果

我有三個表:

records (belongsToMany users) 
users (belongsToMany records) 
record_user (pivot) 

record_user表也有role列。

我試圖讓所有地方的用戶有兩種singersongwriterrole記錄:

$results = User::find(Auth::user()->id) 
        ->records() 
        ->wherePivot('role', 'singer') 
        ->orWherePivot('role', 'songwriter') 
        ->get(); 

下面是SQL語法是如何產生的:

select `records`.*, `record_user`.`user_id` as `pivot_user_id`, 
`record_user`.`record_id` as `pivot_record_id` from `records` 
inner join `record_user` on `records`.`id` = `record_user`.`property_id` 
where 
`record_user`.`user_id` = '1' and `record_user`.`role` = 'singer' or 
`record_user`.`role` = 'songwriter' 

結果爲singer角色是預期的:用戶是歌手的所有記錄。問題是songwriter的結果:我收到了所有歌曲作者,查詢不受user_id的限制。出於某種原因,我期待songwriter角色也受到user_id的限制 - 使用雄辯語法編寫此代碼的正確方法是什麼?

+0

那麼究竟是什麼你想獲得?所有用戶是歌曲作者或歌手的記錄? –

+0

@PawelBieszczad是 – Jon

回答

1

嗯..我認爲你需要使用先進的where子句。

$results = Auth::user() 
      ->records() 
      ->where(function($query) { 
       $query->where('record_user.role', '=', 'singer') 
         ->orWhere('record_user.role', '=', 'songwriter'); 
      }) 
      ->get(); 
+0

是的,先決條件問題解決了問題,並導致查詢的角色被括在一起:(&):和('record_user'。'role'='singer'或'recored_user '。'role'='詞曲作者')'。我仍然有點困惑,爲什麼它不能以這種方式起作用。謝謝您的幫助! – Jon

0

如果想獲得記錄,我會做一些類似的:

User::find(Auth::user()->id) 
    ->records() 
    ->where(function($q){ 
     $q->where('records.role', 'singer') 
      ->orWhere('records.role', 'songwriter'); 
    })->get();