如何过滤急切的加载约束以及顶级LIKE过滤器

时间:2019-03-06 05:39:07

标签: laravel eloquent

我有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%'

有什么主意吗?

谢谢。

2 个答案:

答案 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);