laravel在搜索过滤器中仅显示相关数据

时间:2019-03-21 12:12:34

标签: sql laravel laravel-5 eloquent

我正在尝试创建搜索过滤器:

if ($request->has('street')) {
    $streets->where('name', 'like', '%'.$request->street.'%');
}

if ($request->has('house')) {
    $streets->whereHas('properties', function ($query) use ($request) {
        $query->where('house_number', $request->house);
    });
}

return $streets->get();

这当前获取street数据。我想做类似?street=b-34&house=21的事情并显示house数据。

此刻,我仅获得street数据。

2 个答案:

答案 0 :(得分:3)

您的问题似乎每个Laravel开发人员都会经历一天。您忘记了将查询返回到原始构造函数。

您有:

$streets->where('name', 'like', '%'. request('street') .'%');

何时应该拥有:

$streets = $streets->where('name', 'like', '%'. request('street') .'%');

您正在链接方法,因此您应该让它返回原始查询构造函数

编辑基于评论: 除了不返回如上所述的查询之外,您还使用了whereHas,就像@thisiskelvin在他的回答中指出的那样。

您应该使用

if (request()->has('street')) {
    $streets = $streets->where('name', 'like', '%'. request('street') .'%');
}

if (request()->has('house')) {
    $streets = $streets->with(['properties' => function ($query) {
        $query->where('house_number', request('house'));
    }]);
}

return $streets->get();

答案 1 :(得分:0)

您应该能够使用->with()雄辩的方法来实现这一目标。如果请求有一个house查询,它将返回所有properties,其中house_number等于查询到的门牌号码。找到后将附加到返回的结果中:

if (request()->has('street')) {
    $streets = $streets->where('name', 'like', '%'. request('street') .'%');
}

if (request()->has('house')) {
    $streets = $streets->with(['properties' => function ($query) {
        $query->where('house_number', request('house'));
    }]);
}

return $streets->get();

注意:我已将$request更改为使用request()助手。