我有2个表:拍卖和属性。一对多关系。每次拍卖都包含许多属性。
我正尝试直接查询属性,但我需要将 WHERE 子句应用于两列: property.desc 和 使用 Like 。
这就是我所拥有的:
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%'
有什么主意吗?
谢谢。
答案 0 :(得分:1)
可能是可行的,因为我不确定您的应用程序数据流
代码:
Property::with('auction', function($q) use($search) {
$q->where('code', 'LIKE', "%".$search."%");
})->where('desc','LIKE', "%".$search."%")->get();
但是,这只会提供那些属性desc与您的搜索参数匹配的拍卖(可选),这会使整个查询变得不太复杂,因此我建议您对属性进行拍卖,因为拍卖具有您提到的许多属性。 假设您的拍卖模式为“拍卖” 代码:
Auction::with('properties', function($q) use ($search) {
$q->where('desc','LIKE', "%".$search."%");
})->where('code', 'LIKE', "%".$search."%")->get();
或者如果您需要更大的功能,可以使用whereHas和orWhereHas方法在您的条件查询中放置“ where”条件
Property::where('desc','LIKE', "%".$search."%")->orWhereHas('auction', function($q) use($search){ $q->where('code', 'LIKE', "%".$search."%") })->get();
希望这会有所帮助。
答案 1 :(得分:0)
我会做类似的事情:
Property::whereRaw('LOWER(`desc`) LIKE ?', '%'.strtolower($search).'%')
orWhereHas('auction', function($query) use ($search) {
$query->whereRaw('LOWER(`code`) LIKE ?', '%'.strtolower($search).'%')
})->paginate(10);