Laravel在哪里使用if else

时间:2017-08-09 08:39:39

标签: php laravel query-builder

在我的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');

3 个答案:

答案 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();
}