join и where

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

join и where

Сообщение Shappy » 2014.11.19, 22:46

Добрый вечер... Вечно у меня будут проблемы с join'ами видимо... Вопрос такой, есть 2 запроса:

Код: Выделить всё

BidBanner::find()
                ->joinWith('user')
                ->where('users.wallet >= bid_banners.bid')
                ->one(); 

Код: Выделить всё

BidBanner::find()
                ->joinWith('user')
                ->where(['>=', 'users.wallet', new Expression('bid_banners.bid')])
                ->one(); 
Во втором почему-то where не отрабатывает... В первом все нормально... Почему так?

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: join и where

Сообщение zelenin » 2014.11.20, 10:40

для начала приведи оба получившихся sql-запроса.

Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: join и where

Сообщение Shappy » 2014.11.20, 11:22

Код: Выделить всё

BidBanner::find()
            ->joinWith('user')
            ->where('users.wallet >= bid_banners.bid')
            ->one(); 
SELECT `bid_banners`.* FROM `bid_banners` LEFT JOIN `users` ON `bid_banners`.`user_id` = `users`.`id` WHERE users.wallet >= bid_banners.bid

------

Код: Выделить всё

BidBanner::find()
            ->joinWith('user')
            ->where(['>=', 'users.wallet', new Expression('bid_banners.bid')])
            ->one(); 
SELECT `bid_banners`.* FROM `bid_banners` LEFT JOIN `users` ON `bid_banners`.`user_id` = `users`.`id` WHERE `users`.`wallet` >= bid_banners.bid

Первый рабочий, второй where не отрабатывает... Если эти sql выполнять напрямую, то оба будут нормально отрабатывать...
В общем-то проблем нет с этим, просто подумал не баг ли это...

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: join и where

Сообщение zelenin » 2014.11.20, 11:30

Shappy писал(а):Если эти sql выполнять напрямую, то оба будут нормально отрабатывать...
В общем-то проблем нет с этим, просто подумал не баг ли это...
откуда ты эти sql-запросы взял? сам напечатал? или из дебаг-панели?
почему считаешь, что одинаковые запросы будут выполняться по разному, если их выполнять в разных инструментах?

Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: join и where

Сообщение Shappy » 2014.11.20, 11:40

Из дебаг бара взял оба sql... Эти 2 сырых запроса выдачу дают одинаковую, а вот AR разную...

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: join и where

Сообщение zelenin » 2014.11.20, 11:43

Shappy писал(а):Из дебаг бара взял оба sql... Эти 2 сырых запроса выдачу дают одинаковую, а вот AR разную...
а если в оба запроса поставить limit(1)? Проверьте выдачу в АР и напрямую.

Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: join и where

Сообщение Shappy » 2014.11.20, 11:50

BidBanner::find()
->joinWith('user')
->where('users.wallet >= bid_banners.bid')
->limit(1)
->one();

SELECT `bid_banners`.* FROM `bid_banners` LEFT JOIN `users` ON `bid_banners`.`user_id` = `users`.`id` WHERE users.wallet >= bid_banners.bid LIMIT 1
Выдача верная.

----------

BidBanner::find()
->joinWith('user')
->where(['>=', 'users.wallet', new Expression('bid_banners.bid')])
->limit(1)
->one();

SELECT `bid_banners`.* FROM `bid_banners` LEFT JOIN `users` ON `bid_banners`.`user_id` = `users`.`id` WHERE `users`.`wallet` >= bid_banners.bid LIMIT 1
Выдача не верная.

Не поменялось ничего... Сырой sql отрабатывает оба варианта как надо...
Вчера читал про limit(1) ваши сообщения... Странно как-то сделали find()->one()...

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: join и where

Сообщение zelenin » 2014.11.20, 11:52

вы посмотрите получившиеся sql-запросы? Они ведь одинаковые? Тогда не может быть разной выдачи, т.к. в AR приходят те же данные.
Вы что-то путаете.

astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: join и where

Сообщение astronin » 2014.11.20, 11:53

а если сделать без использования "new Expression" во втором запросе, то не работает ?

Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: join и where

Сообщение Shappy » 2014.11.20, 11:54

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

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: join и where

Сообщение zelenin » 2014.11.20, 11:55

Shappy писал(а):Я понимаю что абсурдно как-то получается... Запросы на самом деле одинаковые на выходе, но по факту выдача у меня разная... Если не сложно, проверьте пожалуйста сами...
проверяю

Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: join и where

Сообщение Shappy » 2014.11.20, 11:55

если без new Expression, то он будет считать за переменную bid_banners.bid, т.е. вставит в sql: 'bid_banners.bid'

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: join и where

Сообщение zelenin » 2014.11.20, 11:59

Shappy писал(а):если без new Expression, то он будет считать за переменную bid_banners.bid, т.е. вставит в sql: 'bid_banners.bid'
ага.
Последний раз редактировалось zelenin 2014.11.20, 12:02, всего редактировалось 1 раз.

Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: join и where

Сообщение Shappy » 2014.11.20, 12:02

Как это нормально? я же сравниваю с другой колонкой, а не с переменной...

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: join и where

Сообщение zelenin » 2014.11.20, 12:04

Shappy писал(а):Как это нормально? я же сравниваю с другой колонкой, а не с переменной...
да, вы правы. Я просто не понял вашего сообщения.

Протестировал

Код: Выделить всё

$m = Post::find()
    ->joinWith('user')
    ->where('user_user.id >= blog_post.id')
    ->one();
 

Код: Выделить всё

SELECT `blog_post`.* FROM `blog_post` LEFT JOIN `user_user` ON `blog_post`.`user_id` = `user_user`.`id` WHERE user_user.id >= blog_post.id

Код: Выделить всё

$m = Post::find()
    ->joinWith('user')
    ->where('user_user.id >= blog_post.id')
    ->where(['>=', 'user_user.id', 'blog_post.id'])
    ->one(); 

Код: Выделить всё

SELECT `blog_post`.* FROM `blog_post` LEFT JOIN `user_user` ON `blog_post`.`user_id` = `user_user`.`id` WHERE `user_user`.`id` >= blog_post.id
запросы отличаются только экранированием в одном месте, что не критично. Выдача одинаковая - модель с id=1
АР генерирует одинаковые sql-запросы. Получает по этим sql-запросам одинаковую выдачу (sql-запросы выполняются pdo php). Не вижу места ошибке. Что-то вы путаете.
Последний раз редактировалось zelenin 2014.11.20, 12:09, всего редактировалось 2 раза.

Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: join и where

Сообщение Shappy » 2014.11.20, 12:07

Странно что у меня выдача разная... Может надо обновиться... Спасибо, попробую разобраться почему у меня по-другому...
Я понимаю что не должно быть разная, несколько раз уже проверял...

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: join и where

Сообщение zelenin » 2014.11.20, 12:09

Shappy писал(а):Странно что у меня выдача разная... Может надо обновиться... Спасибо, попробую разобраться почему у меня по-другому...
Я понимаю что не должно быть разная, несколько раз уже проверял...
имхо у вас другой запрос, но вы почему-то копируете этот.

Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: join и where

Сообщение Shappy » 2014.11.20, 12:11

Не поленюсь... Еще раз внимательно посмотрю :)

Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: join и where

Сообщение Shappy » 2014.11.20, 12:13

Сейчас только внимательно посмотрел... Попробуйте из вашего запроса второго вместо такого:

Код: Выделить всё

$m = Post::find()
    ->joinWith('user')
    ->where('user_user.id >= blog_post.id')
    ->where(['>=', 'user_user.id', 'blog_post.id'])
    ->one();
Оставить только один where, т.е. такой:

Код: Выделить всё

$m = Post::find()
    ->joinWith('user')
    ->where(['>=', 'user_user.id', 'blog_post.id'])
    ->one();
Выдача та же будет? Ну и там нужен new Expression все же, т.е. такой:

Код: Выделить всё

$m = Post::find()
    ->joinWith('user')
    ->where(['>=', 'user_user.id', new Expression('blog_post.id')])
    ->one(); 
 

Shappy
Сообщения: 86
Зарегистрирован: 2013.09.19, 12:31

Re: join и where

Сообщение Shappy » 2014.11.20, 12:29

Я перепроверил, для достоверности чуть поправил запросы...

Код: Выделить всё

BidBanner::find()
            ->joinWith('user')
            ->where('`users`.`wallet` >= bid_banners.bid')
            ->where(['>=', '`users`.`wallet`', new Expression('bid_banners.bid')])
            ->one()

Код: Выделить всё

BidBanner::find()
            ->joinWith('user')
            ->where(['>=', '`users`.`wallet`', new Expression('bid_banners.bid')])
            ->where('`users`.`wallet` >= bid_banners.bid')
            ->one()
Эти два запроса теперь вообще генерирую одинаковый sql:

Код: Выделить всё

SELECT `bid_banners`.* FROM `bid_banners` LEFT JOIN `users` ON `bid_banners`.`user_id` = `users`.`id` WHERE `users`.`wallet` >= bid_banners.bid
я смотрю в дебаг-баре, сам sql не пишу;)
И точно выдача у меня разная... При первом запросе если вывести вардампом содержание у меня
["bid"]=>
string(5) "500.0"
...
["user"]=>
["wallet"]=>
string(5) "300.0"

При втором запросе у меня:
["bid"]=>
string(5) "555.0"
...
["user"]=>
["wallet"]=>
string(6) "1000.0"

Ответить