[решено] Я негодую... по поводу работы с БД

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Закрыто
Tpona
Сообщения: 222
Зарегистрирован: 2011.06.05, 19:00

[решено] Я негодую... по поводу работы с БД

Сообщение Tpona »

Либо я еще недостаточно изучил этот фреймворк, либо одно из двух...

Вот пример:
Автосайт. Объявления о продаже авто.
Есть таблица с объявлениями advert, есть хранилище изображений storagefile, между ними кросс advert_storagefile.
Кросс потому, что не только картинки объявлений в storagefile хранятся, там вообще все файлы.
Это не суть, прошу не заострять внимание на этом.

Далее мне нужно выбрать последние объявления, у которых есть фотки.
И тут парадокс, без введения нового поля в таблицу advert.photocount использовать для этого модели не получится ((((((((((
То есть я вынужден использовать чтото типа:

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

        $reader = Yii::app()->db->createCommand() 
                ->select('m.title mtitle, m.id mid, mod.title modtitle, mod.id modid, a.*') 
                ->from(CarsAdvert::model()->tableName().' a') 
                ->rightjoin(CarsMarks::model()->tableName().' m', 'a.markId=m.id') 
                ->rightjoin(CarsModels::model()->tableName().' mod', 'a.modelId=mod.id') 
                ->rightjoin(StorageFileCarsAdvers::model()->tableName().' sfc', 'sfc.advertId=a.id') 
                ->order('a.date DESC DESC') 
                ->query();
И тут мы напрочь отрекаемся от CActiveRecord.
Нет, можно, конечно этим запросом выбрать только id объявлений, потом выбрать по ключам их при помощи моделей.
Но это ну как то не правильно, уже 2 запроса получается...

Вобщем, пошел я делать еще поле photocount в таблице объявлений, и соотв-но буду искать все места где может измениться количество картинок и т.п... ((
Печалька...

Или я чего не допер еще в Yii? Просветите меня пожалуйста...
Последний раз редактировалось Tpona 2013.11.09, 16:22, всего редактировалось 1 раз.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Я негодую... по поводу работы с БД

Сообщение anton44eg »

Так тут - это ваш выбор отречься от AR. Никто ведь вам не мешает переделать этот запрос на AR
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Я негодую... по поводу работы с БД

Сообщение Nafania »

relations изучите для начала.
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Re: Я негодую... по поводу работы с БД

Сообщение Stepan Selyuk »

Как-то так наверное:

SELECT p.id, GROUP_CONCAT(f.path) FROM files f LEFT OUTER JOIN posts p ON f.post_id=p.id GROUP BY p.id ORDER BY p.dcreate DESC LIMIT 10;

Он выберет фотки ( у которых конечно же есть id объявления ), затем сгруппирует их по ID объявления и отсортирует по дате создания объявления. В итоге вы получите то, что хотели, и еще список путей к фоткам или их ID.

Это конечно в самом relations все указать (параметры запроса)

Код не проверял.
Сначала невидимое, затем видимое. И так у всех программистов :)
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Я негодую... по поводу работы с БД

Сообщение flashimage »

http://www.yiiframework.com/doc/guide/1 ... tabase.arr
зы. да и rightjoin желательно не использовать - считается дурным тоном
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Tpona
Сообщения: 222
Зарегистрирован: 2011.06.05, 19:00

Re: Я негодую... по поводу работы с БД

Сообщение Tpona »

anton44eg писал(а):Так тут - это ваш выбор отречься от AR. Никто ведь вам не мешает переделать этот запрос на AR
Как не отрекаться и сделать этот запрос с использованием AR? Но без создания дополнительного поля а использовать статический запрос для посчета количества фоток? Ну или любым другим способом...
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Я негодую... по поводу работы с БД

Сообщение Nafania »

Помимо relations вам еще и sql надо подучить.
Негодовать вам надо по поводу отсутствия у вас необходимых знаний, а не работы фреймворка.
LEFT JOIN даст вам все записи, не зависимо от наличия фоток.
INNER JOIN даст вам все записи с фотками.
Tpona
Сообщения: 222
Зарегистрирован: 2011.06.05, 19:00

Re: Я негодую... по поводу работы с БД

Сообщение Tpona »

Nafania писал(а):Помимо relations вам еще и sql надо подучить.
Негодовать вам надо по поводу отсутствия у вас необходимых знаний, а не работы фреймворка.
LEFT JOIN даст вам все записи, не зависимо от наличия фоток.
INNER JOIN даст вам все записи с фотками.
Ну это всего копипаста другого запроса с некоторыми правками, я его не запускал, потому что-то не доправил, упустил.
Суть поста не в этом, я ее пытался изложить выше.
Хочу использовать AR для данной задачи, но либо с моими условиями этого не получится либо я не понял как это сделать.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Я негодую... по поводу работы с БД

Сообщение Nafania »

либо я не понял как это сделать.
relations, inner join - вот ответ.
Tpona
Сообщения: 222
Зарегистрирован: 2011.06.05, 19:00

Re: Я негодую... по поводу работы с БД

Сообщение Tpona »

У меня ведь в модели с изображением, строятся путь до исходной картинки, и пути к превьюшкам для разных разрешений.
В случае с createCommand мне теперь надо изгаляться.
Пошел перечитывать relations...
Tpona
Сообщения: 222
Зарегистрирован: 2011.06.05, 19:00

Re: Я негодую... по поводу работы с БД

Сообщение Tpona »

Nafania писал(а):
либо я не понял как это сделать.
relations, inner join - вот ответ.
Спасибо )
Но можно еще вопрос?
Как выбрать объявления с количеством фоток больше 2 к примеру?
То есть интересно как посчитать связанные записи и сравнить посчитанное?


Вот тут я спрашивал,
http://www.yiiframework.ru/forum/viewto ... =3&t=14865
кроме как с createCommend тоже не нашел ответа.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Я негодую... по поводу работы с БД

Сообщение samdark »

Если при этом не выбирать сами фотки, то это запрос вроде

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

SELECT a.*
FROM advertising a
JOIN photo p on p.advertising_id = a.id
GROUP BY a.id
HAVING COUNT(p.id > 2)
Если нужно выбрать вместе с фото, понадобится что-то с подзапросом:

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

SELECT a.*
FROM advertising a
JOIN photo p on p.advertising_id = a.id
WHERE (
  SELECT COUNT(*) FROM photo WHERE advertising_id = a.id
) > 2
Я лично добавляю в таблицу advertising поле photos_count и обновляю его при редактировании. Ну или в отдельную таблицу с счётчиками. Тогда запросы получаются очень и очень простыми: AR перевариваются на ура, работают быстрее.
Tpona
Сообщения: 222
Зарегистрирован: 2011.06.05, 19:00

Re: Я негодую... по поводу работы с БД

Сообщение Tpona »

Sam Dark писал(а):Если при этом не выбирать сами фотки, то это запрос вроде

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

SELECT a.*
FROM advertising a
JOIN photo p on p.advertising_id = a.id
GROUP BY a.id
HAVING COUNT(p.id > 2)
Я лично добавляю в таблицу advertising поле photos_count и обновляю его при редактировании. Ну или в отдельную таблицу с счётчиками. Тогда запросы получаются очень и очень простыми: AR перевариваются на ура, работают быстрее.
Да, все получилось, и на моделях тоже, спасибо.
Мне было принципиально разобраться без счетчиков, как это сделать, но счетчики добавил, понимаю что это как минимум быстрее будет работать...
Закрыто