// SELECT * FROM users WHERE ((SELECT count(*) FROM roles WHERE user.role_id = roles.id AND id = 1) < 1) AND ...
User::whereDoesntHave('Role', function ($query) use($id) {
$query->whereId($id);
})
->get();
这对我来说是正确的! 对于简单的“Where not exists relationship”,请使用以下命令:
// User model
public function availableItems()
{
$ids = \DB::table('item_user')->where('user_id', '=', $this->id)->lists('user_id');
return \Item::whereNotIn('id', $ids)->get();
}
$items = Item::whereNotIn('id', function ($query) use ($user_id)
{
$query->select('item_id')
->table('item_user')
->where('user_id', '=', $user_id);
})
->get();
如果这是我经常做的事情,我会将它作为一个范围方法添加到Item模型中。
class Item extends Eloquent {
public function scopeWhereNotRelatedToUser($query, $user_id)
{
$query->whereNotIn('id', function ($query) use ($user_id)
{
$query->select('item_id')
->table('item_user')
->where('user_id', '=', $user_id);
});
}
}
8条答案
按热度按时间sd2nnvve1#
查看类
Illuminate\Database\Eloquent\Builder
的源代码,我们在Laravel中有两个方法可以执行此操作:whereDoesntHave
(与whereHas
相反)和doesntHave
(与has
相反)这对我来说是正确的!
对于简单的“Where not exists relationship”,请使用以下命令:
对不起,我不懂英语,我用的是谷歌翻译。
nkcskrwz2#
为了简单和对称,您可以在User模型中创建一个新方法:
要使用call:
4ktjp1zp3#
这并不简单,但通常最有效的方法是使用子查询。
如果这是我经常做的事情,我会将它作为一个范围方法添加到Item模型中。
然后像这样使用它。
xn1cxnb44#
左连接怎么样?
假设表是
users
、items
和item_user
,则查找与用户123
不关联的所有items
:w41d8nur5#
这应该对你有用
r7xajy2e6#
最后写了这样一个作用域:
然后呼叫:
目前可以使用,但有点混乱。希望看到类似
not
的关键字:基本上,Eloquent无论如何都会运行上面的查询,只是用
=
代替了<>
。hujrc8aj7#
也许你可以使用:
图片来源:www.example.comhttp://laravel.com/docs/4.2/queries#advanced-wheres
g52tjvyc8#