Relations HAS_ONE не делает limit 1

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
fad
Сообщения: 72
Зарегистрирован: 2012.02.21, 20:26

Relations HAS_ONE не делает limit 1

Сообщение fad »

Это не баг https://github.com/yiisoft/yii/issues/1857, но:

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

    public function relations()
    {
        return array(
            'lastOrder'  => array(self::HAS_ONE, 'ClientOrder', 'client_id', 'order' => 'lastOrder.id DESC'),
        );
    }
И вот я в search модели делаю следующее

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

$criteria->compare('lastOrder.create_user_id', $this->order_user_id);
И на выходе идет запись, которая не соответствует изначальном релейшэну 'order' => 'lastOrder.id DESC'. То есть тут никакого HAS_ONE нету в итоге, идет просто сортировка id DESC и все.
Возможно ли как то делать выборку ТОЛЬКО по одной записи, как описано в релейшэне?
То что в issue на github описано пробовал всунуть в search, ничего не изменилось, это про этот код:

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

$lastComment = $post->comments(array(‘order’=>’id DESC’, ‘limit’=>1)); 
Simple Yii CMS — простая CMS на Yii1 (без composer) с веб-инстяллтором и поддержкой разных БД.
Vladimir P
Сообщения: 60
Зарегистрирован: 2012.08.15, 15:41

Re: Relations HAS_ONE не делает limit 1

Сообщение Vladimir P »

Но что мешает вписать лимит в relation точно также, как вписали ордер?
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Relations HAS_ONE не делает limit 1

Сообщение flashimage »

fad писал(а):Это не баг https://github.com/yiisoft/yii/issues/1857, но:

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

    public function relations()
    {
        return array(
            'lastOrder'  => array(self::HAS_ONE, 'ClientOrder', 'client_id', 'order' => 'lastOrder.id DESC'),
        );
    } 
И вот я в search модели делаю следующее

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

$criteria->compare('lastOrder.create_user_id', $this->order_user_id); 
И на выходе идет запись, которая не соответствует изначальном релейшэну 'order' => 'lastOrder.id DESC'. То есть тут никакого HAS_ONE нету в итоге, идет просто сортировка id DESC и все.
Возможно ли как то делать выборку ТОЛЬКО по одной записи, как описано в релейшэне?
То что в issue на github описано пробовал всунуть в search, ничего не изменилось, это про этот код:

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

$lastComment = $post->comments(array(‘order’=>’id DESC’, ‘limit’=>1));  
Объясните мне плз. какой ордер для одной записи? ордер сортирует результат выборки насколько я помню
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Аватара пользователя
fad
Сообщения: 72
Зарегистрирован: 2012.02.21, 20:26

Re: Relations HAS_ONE не делает limit 1

Сообщение fad »

limit нельзя вписывать в релейшн с HAS_ONE.

ордер это только условие, суть в том, что первая запись берется и по смыслу она должна быть единственной, так и работает, если убрать compare в функции search().
Simple Yii CMS — простая CMS на Yii1 (без composer) с веб-инстяллтором и поддержкой разных БД.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Relations HAS_ONE не делает limit 1

Сообщение flashimage »

твк она и есть единственная. Я не понимаю причем тут ордер для одной записи
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Аватара пользователя
fad
Сообщения: 72
Зарегистрирован: 2012.02.21, 20:26

Re: Relations HAS_ONE не делает limit 1

Сообщение fad »

https://github.com/yiisoft/yii/issues/1857
вот отсюда из первого поста можно понять, что составленный запрос не содержит LIMIT 1 при релейшэне HAS_ONE

Соответственно когда в search идет compare, выборка идет из массива, будто бы это не HAS_ONE а какой-нибудь HAS_MANY.
То есть в relation я указываю HAS_ONE (одну) запись чисто с последним ID, а на выходе идут все записи, а не одна. На гитхабе хоть и на английском но понятно же показано.

Понятно вообще в чем вся соль?
Simple Yii CMS — простая CMS на Yii1 (без composer) с веб-инстяллтором и поддержкой разных БД.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Relations HAS_ONE не делает limit 1

Сообщение flashimage »

fad писал(а):https://github.com/yiisoft/yii/issues/1857
вот отсюда из первого поста можно понять, что составленный запрос не содержит LIMIT 1 при релейшэне HAS_ONE

Соответственно когда в search идет compare, выборка идет из массива, будто бы это не HAS_ONE а какой-нибудь HAS_MANY.
То есть в relation я указываю HAS_ONE (одну) запись чисто с последним ID, а на выходе идут все записи, а не одна. На гитхабе хоть и на английском но понятно же показано.

Понятно вообще в чем вся соль?
нет. Я опять пьян, так что сори если что, но " с последним ID" у вас не работает, потому-что ордер накладывается только на результат выборки - только на 1 элемент , следовательно абсолютность бесполезен
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Аватара пользователя
fad
Сообщения: 72
Зарегистрирован: 2012.02.21, 20:26

Re: Relations HAS_ONE не делает limit 1

Сообщение fad »

ну дак вот только если я этот order из relation уберу у меня будет выводиться совсем другая запись (полагаю, самая первая). А с order я как раз таки указываю - самую последнюю.
Simple Yii CMS — простая CMS на Yii1 (без composer) с веб-инстяллтором и поддержкой разных БД.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Relations HAS_ONE не делает limit 1

Сообщение flashimage »

нет - сначала делается выборка- одна запись, а потом накладывается ордер. Поправьте меня если я не прав))
мне кажется здесь надо использовать max в условиях выборки для выбора последнего ордера
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Ответить