Laravel 如何过滤即时加载约束和类似顶部的过滤器
我有两张桌子:拍卖和财产。一对多的关系。每次拍卖都包含许多财产 我试图直接查询属性,但我需要将WHERE子句应用于两列:property.desc和auction.code,使用LIKE 这就是我所拥有的:Laravel 如何过滤即时加载约束和类似顶部的过滤器,laravel,eloquent,Laravel,Eloquent,我有两张桌子:拍卖和财产。一对多的关系。每次拍卖都包含许多财产 我试图直接查询属性,但我需要将WHERE子句应用于两列:property.desc和auction.code,使用LIKE 这就是我所拥有的: Property::with(['auction'=>function($query) use ($search) { $query->orWhere('code', 'LIKE', "%$search%"); }])-&g
Property::with(['auction'=>function($query) use ($search) {
$query->orWhere('code', 'LIKE', "%$search%");
}])->
where('desc','LIKE', "%$search%")
->paginate(10);
问题在于,雄辩执行的第一个查询是:
SELECT count(*) as aggregate FROM "properties" WHERE "desc"::text LIKE '%df3432sf%'
由于该查询无法获取任何内容,因此Eloquent不会再进一步,我希望它也能在auction.code上应用过滤器
使用原始SQL很容易做到这一点:
select * from properties p
JOIN auctions a ON a."id" = p.auction_id
WHERE a.code LIKE '%x%'
OR p.desc LIKE '%x%'
有什么想法吗
谢谢。我会做如下事情:
Property::whereRaw('LOWER(`desc`) LIKE ?', '%'.strtolower($search).'%')
orWhereHas('auction', function($query) use ($search) {
$query->whereRaw('LOWER(`code`) LIKE ?', '%'.strtolower($search).'%')
})->paginate(10);
可能这会起作用,因为我不确定您的应用程序的数据流 代码:
Property::with('auction', function($q) use($search) {
$q->where('code', 'LIKE', "%".$search."%");
})->where('desc','LIKE', "%".$search."%")->get();
但这将只给那些属性desc与搜索参数匹配的拍卖选项,这将使整个查询变得有点复杂,因此我建议对属性进行拍卖,因为正如您所提到的,拍卖有许多属性。
假设您的拍卖模式是名称拍卖
代码:
或者,如果您需要更多的功能,您可以使用whereHas和orWhereHas方法在has查询中设置where条件
Property::where('desc','LIKE', "%".$search."%")->orWhereHas('auction', function($q) use($search){ $q->where('code', 'LIKE', "%".$search."%") })->get();
希望这能有所帮助。最后一个示例的效果与预期完全一样。它需要4个查询,但不是什么大问题。谢谢。
Property::where('desc','LIKE', "%".$search."%")->orWhereHas('auction', function($q) use($search){ $q->where('code', 'LIKE', "%".$search."%") })->get();