Laravel SearchByKeyword 关系范围?
Laravel SearchByKeyword Scope for Relation?
我在 Whosebug 上找到了这个函数。它允许定义一个关键字,该函数会检查它是否属于我的数据库中不同列的一部分。
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
-table.
有关系
因此,如果我执行 ->orWhere("village_id", "LIKE", "%$keyword%");
,它将在仅包含 ID 的列中进行搜索。我如何告诉 Scope 它应该在 <RelationName> -> name
内搜索?
您可以这样使用 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;
}
希望对您有所帮助!
您可以使用 orWhereHas
方法在 has
查询中添加 where
条件。此方法允许您向关系约束添加自定义约束,例如检查村庄的内容为:
->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%")
});
});
我在 Whosebug 上找到了这个函数。它允许定义一个关键字,该函数会检查它是否属于我的数据库中不同列的一部分。
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
-table.
因此,如果我执行 ->orWhere("village_id", "LIKE", "%$keyword%");
,它将在仅包含 ID 的列中进行搜索。我如何告诉 Scope 它应该在 <RelationName> -> name
内搜索?
您可以这样使用 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;
}
希望对您有所帮助!
您可以使用 orWhereHas
方法在 has
查询中添加 where
条件。此方法允许您向关系约束添加自定义约束,例如检查村庄的内容为:
->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%")
});
});