Laravel QueryBuilder - 相同查询的 `where()` 和 `whereRaw()` 结果不同
Posted
技术标签:
【中文标题】Laravel QueryBuilder - 相同查询的 `where()` 和 `whereRaw()` 结果不同【英文标题】:Laravel QueryBuilder - Different result with `where()` and `whereRaw()` for the identical Query 【发布时间】:2019-10-22 16:17:06 【问题描述】:我正在开发一个 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
的代理那里找到记录。
【问题讨论】:
我猜想要么底层数据不一样,要么你的 php 中用于agents
表的模型在每种情况下都不是同一个对象。
【参考方案1】:
是的,结果本来就不同。
where
方法将列与文字值进行比较
->where('table.column', 'cond', 'value')
如果您希望在不使用whereRaw
方法的情况下在两列中进行比较;你应该改用whereColumn
方法
->whereColumn('table1.column1', 'cond', 'table2.column2')
【讨论】:
【参考方案2】:看来我已经得到了澄清。然而,我想在这里分享我的研发。以防其他人遇到同样的问题。
我打印了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"
# where feed.active agents.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'"
# where feed
.active
'agents.feed_status'
【讨论】:
以上是关于Laravel QueryBuilder - 相同查询的 `where()` 和 `whereRaw()` 结果不同的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent 相当于 QueryBuilder 查询
Laravel QueryBuilder 中的 Postgres 函数 WITH
Laravel 如何获取数组而不是 QueryBuilder select() 语句的对象?
Laravel spatie QueryBuilder GET 请求搜索
Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?