Laravel SearchByKeyword关系范围?

时间:2016-12-13 15:19:57

标签: laravel scope relation

我在Stackoverflow上找到了这个函数。它允许定义一个关键字,该函数检查它是否是我数据库中不同列的一部分。

 public function scopeSearchByKeyword($query, $keyword)
    {
        if ($keyword != '') {
            $query->where(function ($query) use ($keyword) {
                $query->where("reference", "LIKE","%$keyword%")
                    ->orWhere("title", "LIKE", "%$keyword%")
                    ->orWhere("description", "LIKE", "%$keyword%");
            });
        }
        return $query;
    }

现在,我想添加一个->orWhere()来搜索一个村庄。但是在我的模型中只有一个名为village_id的字段,该字段与我的villages - 表格有关系。

所以如果我做->orWhere("village_id", "LIKE", "%$keyword%");,它会搜索只包含id的列。如何告诉它应该在<RelationName> -> name内搜索范围?

2 个答案:

答案 0 :(得分:1)

您可以像这样使用orWhereHas

public function scopeSearchByKeyword($query, $keyword)
{
    if ($keyword != '') {
        $query->where(function ($query) use ($keyword) {
            $query->where("reference", "LIKE","%$keyword%")
                ->orWhere("title", "LIKE", "%$keyword%")
                ->orWhere("description", "LIKE", "%$keyword%")
                ->orWhereHas('villages', function($q) use($keyword) {
                    $q->where('column_name', 'LIKE', "%$keyword%"); // <----- Do your stuff here.
                });
        });
    }
    return $query;
}

希望这有帮助!

答案 1 :(得分:1)

您可以使用orWhereHas方法在where次查询中添加has条件。此方法允许您向关系约束添加自定义约束,例如将村庄的内容检查为:

->orWhereHas('villages', function($q) use($keyword) {
    $q->where("title", "LIKE", "%$keyword%")
});

所以你的最终查询将是:

$query->where(function ($query) use ($keyword) {
    $query->where("reference", "LIKE","%$keyword%")
        ->orWhere("title", "LIKE", "%$keyword%")
        ->orWhere("description", "LIKE", "%$keyword%")
        ->orWhereHas('villages', function($q) use($keyword) {
            $q->where("title", "LIKE", "%$keyword%")
        });
});

Docs