Laravel/Eloquent -在多字段搜索表单中使用动态属性


Laravel/Eloquent - Using dynamic properties in a multi-field search form

我在我的Laravel应用程序中有一个搜索表单,通过属性列表搜索。我的属性表已经有一个模型,并且通过一对多关系连接到另一个名为details的模型/表,其中包含诸如某个属性是否有花园、车库等内容。当做索引或显示的东西,这工作得很好-我可以得到一个属性的详细信息使用$property->details。

搜索表单有一个字段,用户可以在其中搜索这些细节,这就是我挣扎的地方。我不只是需要找到细节本身,我需要首先看看输入中存在的任何东西是否与Details表中的任何东西匹配,然后看看外键(称为prop_id)是否与我的任何属性id匹配,然后在结果中包括这些属性。比如:

    $query = Property::where('archived',0);
    $query->details->where('text',$keyword);
    $results = $query->get();

这不起作用的原因是因为details不是$query的属性,但我不确定使用什么作为替代,因为再次调用property::where()肯定会重置整个查询。我将其全部存储在$query变量中,因为我的表单中的所有字段都是可选的,所以我仅基于在。

中有值的输入构建查询。

这里有点难住了,所以如果有人已经解决了这样的问题,建议将是感激的。干杯!

使用whereHas:

$query = Property::where('archived', 0)->whereHas('details', function ($q) use ($keyword)
{
    $q->where('text', $keyword);
});
$results = $query->get();

您可以尝试这样做:

$query = Property::where('archived', 0);
if(isset($keyword)) {
    $query->whereHas('details', function ($q) use ($keyword) {
        $q->where('text', $keyword);
    });
}
$results = $query->get();