Laravel 如何过滤即时加载约束和类似顶部的过滤器

Laravel 如何过滤即时加载约束和类似顶部的过滤器,laravel,eloquent,Laravel,Eloquent,我有两张桌子:拍卖和财产。一对多的关系。每次拍卖都包含许多财产 我试图直接查询属性,但我需要将WHERE子句应用于两列:property.desc和auction.code,使用LIKE 这就是我所拥有的: Property::with(['auction'=>function($query) use ($search) { $query->orWhere('code', 'LIKE', "%$search%"); }])-&g

我有两张桌子:拍卖和财产。一对多的关系。每次拍卖都包含许多财产

我试图直接查询属性,但我需要将WHERE子句应用于两列:property.desc和auction.code,使用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%'
有什么想法吗


谢谢。

我会做如下事情:

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();