我有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
字段约束页面无关
答案 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 />";
}