orWhere 不使用 Laravel 雄辩的关系查询

Posted

技术标签:

【中文标题】orWhere 不使用 Laravel 雄辩的关系查询【英文标题】:orWhere not working with Laravel eloquent relationship query 【发布时间】:2014-06-27 03:56:24 【问题描述】:

在 Laravel 中,我有两个名为 Booking 和 Clients 的表。对于特定的预订,我与单个客户有 belongsTo 关系。当我向客户查询预订时,一切正常,除非我包括 orWhere。请看下面的代码sn-p。

if($client_name!=null)
        
            $client_name='%'.$client_name;
            $bookings=$bookings->whereHas('client',function($q) use ($client_name)
                $q->where('first_name','LIKE',$client_name)
                    //->orWhere('last_name','LIKE',$client_name);                 
            );
        

使用注释掉的 orWhere 行,我可以使用用户指定的first_name 与客户进行适当的预订。但是当我在 last_name 的查询中使用 or 时,所有行都显示为好像 last_name 与每一行匹配。

它有什么问题?请帮忙。

【问题讨论】:

检查以DB::getQueryLog() 运行的查询,例如 以下是最后一个输出: select * from throttle where user_id = ?限制 1. 我正在使用 Sentry 包进行身份验证。上面的查询在管理页面中运行。 这并没有告诉我们任何信息,请检查clients 表。只需运行您粘贴的代码并立即 dd(DB::getQueryLog()) 或使用 artisan tinker 在 CLI 中执行此操作 在上面的代码给出输出之后运行 dd(DB::getQueryLog()):array(2) [0]=> array(3) ["query"]=> string (44) "select * from users where id = ? limit 1" ["bindings"]=> array(1) [0]=> int(1) ["time"]=> float( 1) [1]=> array(3) ["query"]=> string(52) "select * from throttle where user_id = ? limit 1" ["bindings"]=> array(1 ) [0]=> int(1) ["time"]=> float(1) 。不知道为什么它不显示与预订表相关的查询。 哦,好吧..因为您没有运行查询!在末尾附加get()first(),因此$bookings 将保存查询结果而不是查询生成器。 【参考方案1】:

问题是你现在有这样的代码:

WHERE foreignKey = X AND first_name = Y OR last_name = Z

所以显然它没有返回它应该返回的东西。

现在,要使其正常工作,您需要将这些约束添加为 sub where:

$bookings=$bookings->whereHas('client',function($q) use ($client_name)
            $q->where( function ($q) use ($client_name) 
                $q->where('first_name','LIKE',$client_name)
                    ->orWhere('last_name','LIKE',$client_name);
            );
        );

这将导致如下查询:

WHERE foreignKey = X AND (first_name = Y OR last_name = Z)

这是你需要的。

【讨论】:

工作就像一个魅力!谢谢。

以上是关于orWhere 不使用 Laravel 雄辩的关系查询的主要内容,如果未能解决你的问题,请参考以下文章

雄辩的关系 laravel

Laravel 雄辩的一对多关系

雄辩的关系,模型的链接(Laravel 5.4)

Laravel 通过属性获得雄辩的查询构建器关系

(Laravel) 使用“雄辩的关系”连接 3 个或更多表

Laravel 雄辩的一对一通过(级别/树)关系