Laravel雄辩的查询忽略列值

时间:2018-08-26 15:53:59

标签: laravel search eloquent relationship

Models\Article::class中的搜索方法上,即使在与类别和标签的多重关系中,我也可以获得所有结果,但是我一直试图解决的问题是我只想要已发布文章的结果–我的数据库专栏是一句“活跃的”文章。

我通过切换->where('active', 1)子句尝试了不同的方法,但是结果是相同的。它带来了所有活动和非活动状态。

我在开发中有8篇文章,但是只有7篇文章的active =1。执行搜索时,响应将发送所有8篇文章,而忽略where('active', 1)子句。以下方法可能使我在这里丢失或弄乱了东西:

// Method in the Article Model class
public function getSearchResults($query)
{
    return $this->where('active', 1)->where('start_publishing', '<=', Carbon::now())
            ->where('external_reference', 'LIKE', '%' . $query . '%')
            ->orWhere('byline', 'LIKE', '%' . $query . '%')
            ->orWhere('published_by', 'LIKE', '%' . $query . '%')
            ->orWhere('title', 'LIKE', '%' . $query . '%')
            ->orWhere('subhead', 'LIKE', '%' . $query . '%')
            ->orWhere('lead_story', 'LIKE', '%' . $query . '%')
            ->orWhere('content', 'LIKE', '%' . $query . '%')
            ->orWhere('meta_keywords', 'LIKE', '%' . $query . '%')
            ->with('categories')->orWhereHas('categories', function ($q) use ($query) {
                $q->where('title', 'LIKE', '%' . $query . '%');
            })
            ->with('documents')->orWhereHas('documents', function ($q) use ($query) {
                $q->where('doc_title', 'LIKE', '%' . $query . '%');
                //$q->where('doc_description', 'LIKE', '%'.$query.'%');
            })
            ->with('tags')->orWhereHas('tags', function ($q) use ($query) {
                $q->where('name', 'LIKE', '%' . $query . '%');
            })
            ->with('images')
            ->orderBy('type', 'desc')
            ->orderBy('updated_at', 'desc')
            ->paginate(15);
}

在此预先感谢您的任何帮助。

2 个答案:

答案 0 :(得分:0)

结果是因为您在“条件”或“条件”中使用。要修复它,请使用此

$this->where('active', 1)
     ->where('start_publishing', '<=', Carbon::now())
     ->where(function($q) use ($query) {
         $q->where('external_reference', 'LIKE', '%' . $query . '%') // the $q here is required
         ->orWhere('byline', 'LIKE', '%' . $query . '%')
         ->orWhere('published_by', 'LIKE', '%' . $query . '%')
         ->orWhere('title', 'LIKE', '%' . $query . '%')
         ->orWhere('subhead', 'LIKE', '%' . $query . '%')
         ->orWhere('lead_story', 'LIKE', '%' . $query . '%')
         ->orWhere('content', 'LIKE', '%' . $query . '%')
         ->orWhere('meta_keywords', 'LIKE', '%' . $query . '%');
    })
    ->with('categories')->orWhereHas('categories', function ($q) use ($query) {
        $q->where('title', 'LIKE', '%' . $query . '%');
    })
    ->with('documents')->orWhereHas('documents', function ($q) use ($query) {
        $q->where('doc_title', 'LIKE', '%' . $query . '%');
        //$q->where('doc_description', 'LIKE', '%'.$query.'%');
    })
    ->with('tags')->orWhereHas('tags', function ($q) use ($query) {
        $q->where('name', 'LIKE', '%' . $query . '%');
    })
    ->with('images')
    ->orderBy('type', 'desc')
    ->orderBy('updated_at', 'desc')
    ->paginate(15);

答案 1 :(得分:-1)

好吧,在Davit的建议之后(最初似乎很奏效),但是正是我所进行的查询“伪造”了结果,我终于设法使它奏效了。

按照大卫建议的代码,我通过构造查询的逻辑进行了一些更改,并最终采用了最终的工作方法,该方法仅返回与请求中符合“查询”条件的活动文章。在最终方法代码下方:

// Method in the Article Model class
public function getSearchResults($query)
{
    return $this->where('active', 1)
            ->where('start_publishing', '<=', Carbon::now())
            ->where(function ($q) use ($query) {
                $q->where('external_reference', 'LIKE', '%' . $query . '%')
                        ->orWhere('byline', 'LIKE', '%' . $query . '%')
                        ->orWhere('published_by', 'LIKE', '%' . $query . '%')
                        ->orWhere('title', 'LIKE', '%' . $query . '%')
                        ->orWhere('subhead', 'LIKE', '%' . $query . '%')
                        ->orWhere('lead_story', 'LIKE', '%' . $query . '%')
                        ->orWhere('content', 'LIKE', '%' . $query . '%')
                        ->orWhere('meta_keywords', 'LIKE', '%' . $query . '%');
                $q->with('categories')->orWhereHas('categories', function ($q) use ($query) {
                    $q->where('title', 'LIKE', '%' . $query . '%');
                });
                $q->with('documents')->orWhereHas('documents', function ($q) use ($query) {
                    $q->where('doc_title', 'LIKE', '%' . $query . '%');
                    //$q->where('doc_description', 'LIKE', '%'.$query.'%');
                });
                $q->with('tags')->orWhereHas('tags', function ($q) use ($query) {
                    $q->where('name', 'LIKE', '%' . $query . '%');
                });
            })
            ->with('categories')
            ->with('tags')
            ->with('images')
            ->distinct()
            ->orderBy('type', 'desc')
            ->orderBy('updated_at', 'desc')
            ->paginate(15);
}
相关问题