查询laravel多对多关系

时间:2014-08-26 11:11:50

标签: php laravel

我有3个实体:页面,类别和页面类型。 页面可能是隐藏的,也可能是类别。 (都有hidden列) 页面有page_type_id外键,因此它属于页面类型实体。 页面和类别具有多对多的关系。

我需要查询所有未隐藏的页面以及未隐藏的类别的页面。页面也必须有一些特定的类型。

当涉及到一些复杂的查询时,我总是在与Eloquent斗争。 例如,我想出了如何检查页面是否具有特定类型:

$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和子查询来加载隐藏或不加载的类别。

但是如何检查IF页面是否有类别然后它们不能被隐藏而且IF页面没有类别然后它没有但是我必须得到页面? whereHas不会加载没有类别的网页。并且急切加载只是加载或不加载类别,但它与基于类别中的hidden字段约束页面无关

1 个答案:

答案 0 :(得分:0)

如果您使用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 />";
}