Laravel Eloquent: 如何select 不附加记录在多对多关系中?

Laravel Eloquent: How to select not attached records in many to many relationship?

我在用户和图书之间建立了多对多关系。如何 select 所有不属于特定用户的书籍?

简单但丑陋的方法是加载所有书籍,加载所有附属于用户的书籍并比较集合。但必须有一个优雅的方式,我就是想不通。

可以使用查询构建器和一些连接来完成,但是如何使用 eloquent 实现呢?

你可以使用 whereDoesntHave()

$userId = 1;
$books = Book::whereDoesntHave('users', function($q) use ($userId){
    $q->where('user_id', $userId);
})->get();

此方法允许您根据相关模型的存在 (whereHas)(或在本例中不存在:whereDoesntHave)来过滤查询。


如果您想要所有未分配给任何用户的图书,则更简单一些:

$books = Book::doesntHave('users')->get();