【问题标题】:Laravel Eloquent: How to select not attached records in many to many relationship?Laravel Eloquent:如何在多对多关系中选择未附加的记录?
【发布时间】:2015-02-18 13:58:49
【问题描述】:

我在用户和图书之间存在多对多关系。如何选择所有不属于特定用户的书籍?

简单但丑陋的方法是加载所有书籍,加载所有附加到用户的书籍并区分集合。但是必须有一种优雅的方式,我就是想不通。

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

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

    您可以为此使用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 给出的答案实际上是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2013-01-05
    • 2014-05-30
    • 2014-05-10
    • 2018-09-27
    • 1970-01-01
    • 2019-03-26
    相关资源
    最近更新 更多