在我的Laravel项目中,我使用一些条件构建查询。 有一个问题我无法理解
我的查询如下
$query = SocialMediaFeed::where('location_id', $location_id);
现在有一些饲料项目有自己的' = true ..除非有$ filters数组,否则应首先忽略这些结果。
if(!$filters) {
$query = $query->where('self', '<>', true);
}
我尝试了以下内容,但是这只会返回self = true帖子,而不是所有帖子与self = true相结合
$query = $query
->where('self', '<>', true)
->where('self', true)
->orWhereNull('self');
答案 0 :(得分:2)
您可以使用Conditional Clauses:
// false: All social media feeds except where self is not true
// true: All social media feeds
$filters = false;
$query = SocialMediaFeed::where('location_id', $location_id)
->when(!$filters, function ($query) {
return $query->where('self', '!=', true);
})->get();
答案 1 :(得分:1)
过滤器只能减少结果集,而不是增加。想想过滤器在现实生活中做了什么,它会删除它,它永远不会添加它们。
如果我理解你的要求,我会做这样的事情:
$query = SocialMediaFeed::where('location_id', $location_id);
if(!$filters) {
$query = $query->where('self', '<>', true);
} else {
$query = $query->orWhere('self', true);
}
这将返回location_id = $ location_id AND self&lt;&gt;的所有行当$ filters未设置且所有行中的location_id = $ location_id或self = true时为true。
如果你真的需要只做一个查询然后过滤它,反转你正在做的事情,查询location_id = $ location_id OR self = true并过滤掉self = true,因为没有设置$ filters。
但是,您发布的这段代码确实没有意义:
$query = $query
->where('self', '<>', true)
->where('self', true)
->orWhereNull('self');
我认为您应该查看documentation。多次调用与&#39; AND连接的位置,因此self = true AND self&lt;&gt; true将以0结果结束。
所以我不能100%确定你的目标。我希望我回答你的问题。
答案 2 :(得分:0)
因此,如果您有过滤器,则无需执行任何操作:
$query = SocialMediaFeed::where('location_id', $location_id);
if (!$filters) {
$data= $query->where('self',true)->get();
} else {
$data= $query->get();
}