我正在开发laravel应用程序,其中我有两个非常相似的QueryBuilder
,但在两种情况下都会产生不同的结果。
查询1:
$ids = $this->model->leftJoin('feed', 'agents.identifier', '=', 'feed.identifier')
->whereRaw('feed.active <> agents.feed_status')
->pluck('id');
dd(count($ids)); // print 485236
查询2:
$ids = $this->model->leftJoin('feed', 'agents.identifier', '=', 'feed.identifier')
->where('feed.active', '<>', 'agents.feed_status')
->pluck('id');
dd(count($ids)); // print 4259
我想知道这两个QueryBuilder之间的主要区别。尽管看上去相同,为什么会产生不同的结果?
哪个查询返回正确的结果?如果我想从feed_status
不等同于 feed.active
的代理商那里找到记录。
答案 0 :(得分:8)
看来我已经弄清楚了。但是,我想在这里分享我的研发成果。万一其他人遇到同样的问题。
我已经打印了raw query
,并得到where()
似乎是将第三个参数视为string
比较而不是field
比较。这就是为什么结果似乎不同的原因。
但是,当我们使用whereRaw()
运行查询时,会将其视为表字段比较。
Laravel代码:
$ids = $this->model->leftJoin('feed', 'agents.identifier', '=', 'feed.identifier')
->whereRaw('feed.active <> agents.feed_status')
->pluck('id');
MySql查询:
"select * from `agents` left join `feed` on `agents`.`identifier` = `feed`.`identifier` where feed.active <> agents.feed_status"
#其中feed.active <> agent.feed_status
Laravel代码:
$ids = $this->model->leftJoin('feed', 'agents.identifier', '=', 'feed.identifier')
->where('feed.active', '<>', 'agents.feed_status')
->pluck('id');
MySql查询:
"select * from `agents` left join `feed` on `agents`.`identifier` = `feed`.`identifier` where `feed`.`active` <> 'agents.feed_status'"
#其中feed
。active
<>'agents.feed_status'
答案 1 :(得分:0)
是的,结果本来是不同的。
由于where
方法比较具有文字值的列
->where('table.column', 'cond', 'value')
如果您希望在两列中进行比较而不使用whereRaw
方法;您应该改用whereColumn
方法
->whereColumn('table1.column1', 'cond', 'table2.column2')