2017-04-23 61 views
0

我有這些表:如何獲得沒有特定相關實體的所有實體?

用戶

id 
name 

事件

id 
name 

id 
user_id 
event_id 

如何獲得沒有event_id 4條目的所有用戶?

有了這個代碼:

$users = User::query(); 
$users->leftJoin('entries', 'users.id', '=', 'entries.user_id') 
     ->where('event_id','!=', $event_id)->get(); 

我仍然得到的是已經有針對特定事件的入門用戶。

這就是我想要的:

  • 取得具有EVENT_ID 4
  • 所有條目從這些項目獲得USER_ID
  • 刪除其有user_id的其他條目。

$entries = Entry::where(event_id, '=', 4)->get(); 

foreach ($entries as &$entry) { 
    //remove all entries from $entries array which "user_id = $entry->user_id" 
} 

我該怎麼做上面只是一個查詢?

+0

您是否創建了模型之間的所有關係? – lewis4u

+0

是的,但我不想使用With方法。 – user2909494

+0

爲什麼你不想使用方法?它有什麼問題? – lewis4u

回答

0

去你的問題以下是答案,但我想這不是你最終想要的。所以更多的闡述,並指定採樣的輸入和輸出數據集

select * from your_table where event_id <> 4; 
0

你想要的SQL是:

select user_id 
from t 
group by user_id 
having sum(event_id = 4) = 0; 
0
select u.* 
    from User u 
    left join entries e 
    on e.user_id = u.id and e.event_id = 4 
    where e.id is null 
0

您正在尋找<>,不!=。你也不知道event_id在哪個表上。

嘗試

$users = User::query(); 
$users->leftJoin('entries', 'users.id', '=', 'entries.user_id') 
     ->where('entries.event_id','<>', $event_id)->get(); 

更多信息可以在https://laravel.com/docs/5.4/queries#where-clauses

+1

'<>'和'!='在大多數數據庫中具有相同的功能,更具體地說,在'MySQL'中。 –

0

找到可以使用whereDoesntHave構建器方法。

$users = User::query()->whereDoesntHave("entry", function($q) use ($event_id) { 
    $q->where('id', $event_id); 
})->get(); 

該方法採用閉包,您可以在其中爲不存在的相關實體定義標準。


如果您需要的用戶和項目,我覺得你還是可以使用with加入條目。

$users = User::query() 
    ->with('entries') 
    ->whereDoesntHave("entry", function($q) use ($event_id) { 
     $q->where('id', $event_id); }) 
    ->get(); 
相關問題