这是我雄辩的查询:

$table =  DB::table('invites')   ->leftjoin('connections', 'connections.user_id', '=', 'invites.user_id')   ->where(DB::raw('connections.firm_id = invites.firm_id'))   ->get();

它应该返回一个连接到已经邀请他们的公司的用户的表。

查询日志显示执行以下查询:

'query' => 'select * from `invites` left join `connections` on `connections`.`user_id` = `invites`.`user_id` where connections.firm_id = invites.firm_id is null'

is null在年底被搞乱一切。我认为这是与列名称相同的事实,或者我是否缺少DB :: raw的东西?

 

where()方法将列名称作为第一个参数,如果下一个参数丢失,则将其视为列为空的约束,这就是为什么您得到这样一个奇怪的查询。使用whereRaw()代替:

->whereRaw('connections.firm_id = invites.firm_id')

来自  https://stackoverflow.com/questions/34743325/eloquent-adds-is-null-to-where-query-after-a-left-join

Laravel雄辩地向DB查询添加IS NULL


Doublemedia 在2年前发布

嗨,大家好!

我遇到了一个问题。由于Laravel正在添加的一些奇怪的原因是null。我有以下代码:

Timer :: where('user_id',Auth :: id()) - >其中(DB :: raw(“DATE(started_at)= DATE(NOW())”) - > whereNotNull('ends_at') - >得到();

这导致:select * from timewhere user_id=?和DATE(started_at)= DATE(NOW())为空,ended_at不为空

我不明白的是,在DATE(NOW())之后,它在哪里是空的?我错过了什么吗?

欧文

 
里卡多 2年前回答 解决方案

哪里需要两个参数,你只有一个。使用whereRaw代替。

Doublemedia于 2年前回复

Thx,从来没有,这将是问题。所以一个var在 - >其中result为null。

maknz 2年前回复

where()方法以形式使用where($column, $operator, $value),例如where('reputation', '>', 10)如果您使用的是equals运算符,则可以提供两个参数,例如where('user_id', 4)

查看API的方法:https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Query/Builder.php#L384,如果您只提供列,则运算符和值默认为空值。在方法中进一步下调,检查值是否为空,并将查询转换为适当的“is null”条件(因为使用“field = null”将不起作用),因此与您的行为似乎一致正在看。

因此,如上所述,whereRaw()您需要使用特定于您正在使用的DBMS的原始数据,而不是抽象的查询构建器。

来自  https://laravel.io/forum/09-13-2014-laravel-eloquent-adding-is-null-to-db-query?page=1

 

在Eloquent中使用where()中的DB :: raw添加“SQL NULL”到SQL查询 #1591

 关闭
nikoskip 打开这个问题 on 10 Jun 2013 ·10条评论

注释

 

 
项目
还没有
8人参加
@nikoskip@taylorotwell@franzliedke@ jedwards1211@caleywoods@darkwinternight@Cadey@gabrielkoerich
@nikoskip
我正在尝试使用我的查询的where()方法中的用户DB :: raw,使用Eloquent,但由于某些原因,在我的where子句之后添加'is null'。这是我的代码:People::has('user')->where(DB::raw('first_name = \'Niko\''))->orderBy($sort, $order)->paginate($perPage););它执行这些SQL:0.67ms  select count(*) as aggregate from `people` where (select count(*) from `users` where `users`.`people_id` = `people`.`id`) >= '1' and first_name = 'Niko' is null 0.69ms  select * from `people` where (select count(*) from `users` where `users`.`people_id` = `people`.`id`) >= '1' and first_name = 'Niko' is null order by `id` desc limit 1 offset 0但是如果我尝试这样做:People::has('user')->where('first_name', 'Niko')->orderBy($sort, $order)->paginate($perPage);生成这些SQL:0.94ms  select count(*) as aggregate from `people` where (select count(*) from `users` where `users`.`people_id` = `people`.`id`) >= '1' and `first_name` = 'Niko' 0.72ms  select * from `people` where (select count(*) from `users` where `users`.`people_id` = `people`.`id`) >= '1' and `first_name` = 'Niko' order by `id` desc limit 1 offset 0正如你可以看到的是相同的SQL,但在WHERE之后没有'是null'。这只是一个例子,我知道我可以使用第二种方法,但是我需要使用DB :: raw,因为我会生成复杂的子句。我有最新版本的Laravel。 
@taylorotwell
 所有者

泰勒洛维尔 评论道 on 10 Jun 2013

使用whereRaw并传递一个字符串。
 

 taylorotwell 关闭了这个 on 10 Jun 2013

 
@nikoskip
whereRaw对我来说是新的 我从来没有听说过,非常感谢@taylorotwell。有一种方法来嵌套使用雄辩的clausules(不使用whereRaw)?BTW,我在几天前对文档进行了一些修改,如果能够接受,将会很棒。 
@franzliedke
 贡献者

franzliedke 评论 on 10 Jun 2013

你可以将封闭件传递给where()函数:http : //laravel.com/docs/queries#advanced-wheres2013年6月10日(星期一)上午3:50,Nikolas notifications@github.com写道:whereRaw对我来说是新的 我从来没有听说过,非常感谢@taylorotwellhttps://github.com/taylorotwell 。有一种方法来嵌套使用雄辩的clausules(不使用whereRaw)?BTW,我在几天前对文档进行了一些修改,如果能够接受,将会很棒。- 直接回覆这封电子邮件或在GitHubhttps上查看://github.com/laravel/framework/issues/1591#issuecomment-19178058 。 
@nikoskip
感谢您的建议@franzliedke 
@ jedwards1211
这对我来说是一个很大的帮助,谢谢@taylorotwell! 
@caleywoods
这只是从一天的故障排除中救了我的屁股。谢谢@taylorotwell。对于任何后来来的人,可能需要使用某种sql函数,to_char或者extract(我在Oracle上),我也在做whereHas。这是我有的:$request = Request::all(); $interface_type_id = $request['interface_type_id']; $month             = $request['month']; $data = CommissionActivityDetail::with('CommissionActivity.Type',                                       'AcctInfo.employee'        )->whereHas('CommissionActivity.Type', function($q) use ($interface_type_id, $month) {            $q->where('interface_type_id', '=', $interface_type_id)              ->whereRaw("extract(month from commission.commission_activity_detail.created_date) = $month"); })->get();这允许我在特定月份(1月)至12月12日期间返回有关特定类型的条目的详细信息(认为工资单或报销单)。我不得不去whereHas路由,因为我的父表不包含外键到类型表,而是具有指向另一个表(称为interface_activity)的外键,然后它具有FK到类型表。看起来像这样,爬上树:活动详细信息 - > [FK]活动 - > [FK]界面活动 - > [FK]界面类型 
@darkwinternight
@taylorotwell似乎工作。但这是一个bug DB::raw()吗? 
@Cadey
 

卡迪 评论道 on 6 Aug 2015

嗨,这是一个奇怪的一个,我也被它一下子弄死了...其中(DB:原始( 'blar'))VSwhereRaw( 'blar')但是为什么DB :: raw()以这种方式工作,添加额外的是null到底? 
@gabrielkoerich
 贡献者

gabrielkoerich 评论 on 8 Aug 2015

@caleywoods您的查询不安全。您必须使用准备好的语句:- > whereRaw(' extract(month from commission.commission_activity_detail.created_date)=?',[ $ month ]); 
@caleywoods
@ gabrielkoerich对此做了一些研究,我会确定并使用你的例子。这是否确保绑定变量在oracle中使用或者这只是DB不可知和最佳做法?编辑:我做了一些更多的测试。我们正在使用一个插件来让Lumen(laravel micro)与oracle数据库通讯。Oracle在每个查询上使用绑定变量。我无法得到任何恶意类型的输入执行与语法失败。您可以在这里看到生成的错误:autoparam0::autoparam1是插件在做oracle准备查询的工作:https://gist.github.com/caleywoods/c4aed3a532c7b261cdff来自  https://github.com/laravel/framework/issues/1591