Php 查询laravel多对多关系

Php 查询laravel多对多关系,php,laravel,Php,Laravel,我有3个实体:页面、类别和页面类型。 页面和类别可能被隐藏。两者都有隐藏列 页面具有页面类型id外键,因此它属于页面类型实体。 页面和类别具有多对多关系 我需要查询所有的网页,这是没有隐藏,也没有链接到类别是隐藏的。页面也必须有特定的类型 当涉及到一点复杂的问题时,我总是与雄辩抗争。 例如,我了解了如何检查页面是否具有特定类型: $materials = Page::whereHas('type', function($query) { $query->where('type',

我有3个实体:页面、类别和页面类型。 页面和类别可能被隐藏。两者都有隐藏列 页面具有页面类型id外键,因此它属于页面类型实体。 页面和类别具有多对多关系

我需要查询所有的网页,这是没有隐藏,也没有链接到类别是隐藏的。页面也必须有特定的类型

当涉及到一点复杂的问题时,我总是与雄辩抗争。 例如,我了解了如何检查页面是否具有特定类型:

$materials = Page::whereHas('type', function($query) {
    $query->where('type', 'material'); // A little bit confusing, type is a column name and also the relationship name, that's why I have type in whereHas and in where. Nevermind
);
我了解了如何加载隐藏或不使用with和subquery的类别

但如何检查,如果网页有类别,那么它们一定不能被隐藏,如果网页没有类别,那么它没有,但我必须得到的网页呢? whereHas不会加载没有类别的页面。而即时加载只是加载或不加载类别,但它与基于类别中的隐藏字段约束页面无关

如果使用with而不是whereHas,则即使页面没有类别,它也会返回页面。然后在子查询中,仅选择未隐藏的类别。这意味着它将只限制返回的类别,而不限制页面

这对我来说很有用,因为我的模型和表使用了正确的Laravel命名约定

$pages = Page::where('hidden', '0')
    ->with('categories', function($q)
    {
        $q->where('hidden', '0');
    })
    ->has('pageType')
    ->get();


foreach($pages as $page) {
    echo "Page Name: ".$page->name."<br />";
    echo "Page Type: ".$page->pageType->name."<br />";
    echo "Categories: <br /> <ul>";
    foreach($page->categories as $category) {
        echo "<li>".$category->name."</li>";
    }
    echo "</ul>";
    echo "<br />";
}

老实说,我没有明白。是的,我会得到没有隐藏类别的页面。我不会让页面被过滤。我所做的-我获取了所有页面,然后使用集合筛选方法,手动循环遍历每个页面,如果其类别是隐藏的,我将页面从集合中删除第一行的第一个位置是按隐藏过滤页面。这是页面隐藏字段。但是,当页面属于隐藏类别时,也必须排除页面。而带有急切类别加载的部分只过滤将连接到页面的类别,因此如果类别被隐藏,则它将不在页面对象中,但页面对象将从DB中获取。因此,如果页面没有任何类别,你不希望该页面显示在结果中?如果一个页面有隐藏的类别,或者如果所有类别都没有隐藏,但是页面本身是隐藏的:所以我已经通过循环页面类别并检查是否有任何类别被隐藏来完成了。首先,我得到了所有带有类别的页面,这些类别没有隐藏,其次,我检查所有类别是否隐藏