我在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
内搜索范围?
答案 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%")
});
});