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

roo*_*man 4 php mysql laravel eloquent

我在用户和书籍之间有很多关系.如何选择未附加到特定用户的所有书籍?

简单但丑陋的方式是加载所有书籍,加载附加到用户的所有书籍并区分馆藏.但必须有一种优雅的方式,我只是想不出来.

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

luk*_*ter 13

你可以用whereDoesntHave()它:

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

此方法允许您通过相关模型的presence(whereHas)(或在此情况下不存在:) 过滤查询whereDoesntHave.


如果您希望所有未分配给任何用户的书籍更简单:

$books = Book::doesntHave('users')->get();
Run Code Online (Sandbox Code Playgroud)