Php Laravel雄辩:如何在多对多关系中选择未附加的记录?

Php Laravel雄辩:如何在多对多关系中选择未附加的记录?,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我在用户和书籍之间有一种多对多的关系。如何选择未附加到特定用户的所有书籍 简单但难看的方法是加载所有书籍,加载所有附加到用户的书籍并区分收藏。但必须有一种优雅的方式,我就是想不出来 这可以使用查询生成器和一些连接来完成,但是如何使用eloquent来实现呢?您可以使用whereDoesntHave()来实现: $userId = 1; $books = Book::whereDoesntHave('users', function($q) use ($userId){ $q->wh

我在用户和书籍之间有一种多对多的关系。如何选择未附加到特定用户的所有书籍

简单但难看的方法是加载所有书籍,加载所有附加到用户的书籍并区分收藏。但必须有一种优雅的方式,我就是想不出来


这可以使用查询生成器和一些连接来完成,但是如何使用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();

在这种情况下,您也不需要闭包,但值得注意的是,它可能需要一个闭包。如果您想对where语句有更多的控制权,也可以使用'Book::doesntHave($relationship,$condition='and',Closure$Closure)'。@DavidBarker是的,您确实需要闭包吗?没有它,您只能筛选分配给任何用户或没有用户的书籍。@lukasgeiter这是OP要求的。。。所有未附加到任何用户的书籍。。。除非他想通过当前登录的用户对其进行过滤,否则此操作不需要关闭。。。那时就需要关闭了。不管怎样,回答都很好。@DavidBarker我很高兴这是关于当前登录用户的。引用:“加载附加到用户的所有书籍并区分收藏”。(用户)。不管怎样,我相信rootman很快就会解决这个问题;)我指的是一个特定的用户,将更新我的问题,因为我的措辞有点糟糕,所以@lukasgeiter给出的答案实际上就是我想要的。