Laravel QueryBuilder-相同查询的{where()`和`whereRaw()`的结果不同

时间:2019-06-07 07:07:57

标签: mysql laravel laravel-query-builder

我正在开发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的代理商那里找到记录。

2 个答案:

答案 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'"

#其中feedactive <>'agents.feed_status'

答案 1 :(得分:0)

是的,结果本来是不同的。

由于where方法比较具有文字值的列

->where('table.column', 'cond', 'value')

如果您希望在两列中进行比较而不使用whereRaw方法;您应该改用whereColumn方法

->whereColumn('table1.column1', 'cond', 'table2.column2')