【问题标题】:Laravel QueryBuilder - Different result with `where()` and `whereRaw()` for the identical QueryLaravel QueryBuilder - 相同查询的 `where()` 和 `whereRaw()` 结果不同
【发布时间】: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 表的模型在每种情况下都不是同一个对象。

标签: mysql laravel laravel-query-builder


【解决方案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'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多