scopes

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

scopes

Сообщение Ekstazi »

Думаю, это можно отнести к багу. Версия yii 1.0.7. В общем, есть модели Photo и Price.
Price связано с Photo:

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

        return array(
                    'photo'=>array(self::HAS_MANY,'Photo','idItem'),
        );
 
В Photo указана именованая группа:

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

        public function scopes(){
            return array(
                'first'=>array(
                    'limit'=>1,
                ),
            );
        }
 
Так вот, при попытке сделать так:

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

        $models=Price::model()->with('photo:first')->findAll($criteria);
 
Полностью игнорируется именованая группа first. Я понимаю, что в sql запросе такое нельзя сделать. Но можно отсеять остальные значения по limit, а не возвращать все.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: scopes

Сообщение samdark »

1) Для начала надо обновиться до 1.0.8.

2) Тут точно many to many?

3) Я верно понял, что нужно выбрать пункт прайс-листа с любым первым фото?

Если да, то LIMIT проблемы тут точно не решит: выбрерется одна запись всего, а не одно фото на каждый пункт т.к. при построении итогового запроса используется JOIN по кросс-таблице без подзапроса.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: scopes

Сообщение Ekstazi »

1) я еще не обновлялся, лень портировать. Но в списке изменений 1.0.8 про limit ничего нету
2) отношение 1 ко многим
3) вы совершено правы.
join'ится это точно, смотрел в запросы, обратите внимание, scope стоит для Photo. Я смотрел запросы, limit вообще не применяется. Но, по логике вещей, связаная модель должна возвращать только один элемент, а остальные отсеять.(запрос то вернет все, по-любому, но, правильная работа заключается в отсеевании).
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: scopes

Сообщение samdark »

Вернуть всё и отсеять — это как-то затратно…

Не лучше ли сделать так:

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

$models=Price::model()->findAll($criteria);
 
а уже при выводе:

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

foreach($models as $model){
  echo $model->photo->my_photo_field;
}
 
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: scopes

Сообщение Ekstazi »

По логике вещей. 9 элементов на странице у меня. В моём случае идет только 2 запроса, в вашем - 1+9=10 (минимум). 10 запросов - это многовато.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: scopes

Сообщение samdark »

Количество запросов ещё ни о чём не говорит.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: scopes

Сообщение Ekstazi »

Я знаю, но у меня как приоритетный фактор - высокая производительность сайта.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: scopes

Сообщение samdark »

Тогда лучше задуматься о денормализации базы. Что если добавить каждому прайсу по полю с последней загруженной картинкой?
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: scopes

Сообщение Ekstazi »

Как вариант, ну что-то типо того :):

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

select *,(select path from Photo WHERE idItem=1 limit 1) as path from Price where id=1
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: scopes

Сообщение Ekstazi »

И 2 запроса, если нужно по две фотки брать(не самое красивое решение):

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

--Для получения товаров
select * from Price where idCategory=7;
--Для получения фоток
(select idItem,path from Photo WHERE idItem=2 limit 2) union (select idItem,path from Photo WHERE idItem=1 limit 2)
 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: scopes

Сообщение samdark »

Ну… тут нужно из реальных требований исходить. Если нужна одна фотка — делаем одно поле. Если две — два.

Ещё можно фото закешировать. Тогда вариант с $model->photos будет выглядеть очень неплохо: в случае с сложным запросом кеш просто так не построишь.
Ответить