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%")
        });
});

Docs