Laravel QueryBuilder - различный результат с `where ()` и `whereRaw ()` для идентичного запроса - PullRequest
7 голосов
/ 07 июня 2019

Я работаю над приложением 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 ]

8 голосов
/ 07 июня 2019

кажется, я получил разъяснение.Однако я хотел бы поделиться своими исследованиями и разработками здесь.Если кто-то еще столкнулся с такой же проблемой.

Я напечатал 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 Query:

"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 Query:

"select * from `agents` left join `feed` on `agents`.`identifier` = `feed`.`identifier` where `feed`.`active` <> 'agents.feed_status'"

# где feed. active <> 'agents.feed_status«

0 голосов
/ 07 июня 2019

Да, результаты должны были отличаться.

Как метод where сравнивает столбец с литеральным значением

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

Если вы хотите провести сравнение в двух столбцах без использования метода whereRaw; вместо этого вы должны использовать whereColumn метод

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