【问题标题】:Get all records from Model that do NOT have an entry in pivot table Laravel 5从模型中获取所有在数据透视表 Laravel 5 中没有条目的记录
【发布时间】:2026-01-06 13:10:01
【问题描述】:

我正在尝试弄清楚如何实现以下目标。我找了又找都没用。

我在一个 Laravel 5 应用程序中有一个数据透视表,它在各个模型中使用以下功能按预期工作。

// Module.php
//...
public function sites()
{
    return $this->belongsToMany('App\Site')->withPivot('enabled');
}

// Site.php
//...
public function modules()
{
    return $this->belongsToMany('App\Module')->withPivot('enabled');
}

我可以在我的 Sitecontroller.php 中检索所有相关记录,如下所示

$site = Site::with('modules')->findOrFail($id);

我遇到的问题是我希望能够在相关站点的数据透视表中获取所有没有关联记录的模块。

谁能指出正确的方向,我如何以正确的方式实现这样的事情(我可以​​想到几种方法,但看起来真的很hacky)

提前致谢。 M

【问题讨论】:

    标签: php mysql laravel pivot-table laravel-5


    【解决方案1】:

    Module 端开始查询并使用whereDoesntHave 排除在这种情况下应该可以工作:

    $id = 1;
    $modules = Module::whereDoesntHave('sites', function($q) use ($id){
        $q->where('site_id', $id);
    })->get();
    

    【讨论】:

    • 嗨 Lukas,我现在觉得自己很蠢 :)。我想我的“新鲜感”已经闪耀了 :) 这完美地做到了。
    • 别觉得自己很蠢 ;) whereDoesntHave 是 Eloquent 的高级技巧之一,不幸的是,文档中也没有提到它......
    • 我想是的,在我的搜索条件下,我找不到任何东西,我们生活和学习。再次感谢卢卡斯。
    • 这是最好的答案,而不是使用不相关或存在方法。谢谢