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 雄辩的关系查询的主要内容,如果未能解决你的问题,请参考以下文章