Laravel QueryBuilder - 相同查询的 `where()` 和 `whereRaw()` 结果不同
Laravel QueryBuilder - Different result with `where()` and `whereRaw()` for the identical Query
我正在开发一个 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 之间的主要区别。为什么它产生不同的结果,虽然它看起来相同?
哪个查询 returns 是正确的结果?如果我想从代理中找到 feed_status
不等于 feed.active
.
的记录
看来我得到了澄清。然而,我想在这里分享我的研发。如果其他人遇到同样的问题。
我打印了 raw query
并得到 where()
似乎将第三个参数视为 string
比较而不是 field
比较。这就是为什么结果似乎不同的原因。
然而,当我们 运行 使用 whereRaw()
的查询时,它被视为 table 字段比较。
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 <> 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'"
# 其中 feed
.active
<> 'agents.feed_status'
是的,结果本来就是不同的。
As where
方法将列与文字值进行比较
->where('table.column', 'cond', 'value')
如果您希望在不使用 whereRaw
方法的情况下对两列进行比较;你应该改用 whereColumn
方法
->whereColumn('table1.column1', 'cond', 'table2.column2')
我正在开发一个 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 之间的主要区别。为什么它产生不同的结果,虽然它看起来相同?
哪个查询 returns 是正确的结果?如果我想从代理中找到 feed_status
不等于 feed.active
.
看来我得到了澄清。然而,我想在这里分享我的研发。如果其他人遇到同样的问题。
我打印了 raw query
并得到 where()
似乎将第三个参数视为 string
比较而不是 field
比较。这就是为什么结果似乎不同的原因。
然而,当我们 运行 使用 whereRaw()
的查询时,它被视为 table 字段比较。
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 <> 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'"
# 其中 feed
.active
<> 'agents.feed_status'
是的,结果本来就是不同的。
As where
方法将列与文字值进行比较
->where('table.column', 'cond', 'value')
如果您希望在不使用 whereRaw
方法的情况下对两列进行比较;你应该改用 whereColumn
方法
->whereColumn('table1.column1', 'cond', 'table2.column2')