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

问题描述 投票:1回答:2

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

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数据。

sql laravel laravel-5 eloquent
2个回答
0
投票

你应该能够通过使用->with() eloquent方法实现这一目标。如果请求有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()助手。


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();
© www.soinside.com 2019 - 2024. All rights reserved.