Yii2 сортировка по связанным таблицам


  • Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.

    Ответить 22 сообщения Noobie Сообщения: 29 Зарегистрирован: 2014.06.03, 13:38

    Сортировка связанных по промежуточной таблице

    • Цитата
    Все привет! Только начал изучать Yii.
    Ситуация такая, пишу модуль галерея изображений.
    В базе есть 3 таблицы
    tbl_gallery
    с полями:
    id, name, url
    tbl_images
    поля:
    id, sml_img, mid_img, big_img
    tbl_gallery_images
    поля:
    id, gallery_id, image_id, sort
    В модели Gallery прописываю связь

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

    public function getImages() { return $this->hasMany(\app\models\Image::className(), ['id'=>'image_id'])->viaTable('{{%gallery_images}}', ['gallery_id'=>'id']); } И всё в принципе работает, данные есть.
    Но мне нужно сделать чтобы связанные изображения сортировались по полю сортировка sort из промежуточной таблицы tbl_gallery_images.
    Подскажите пожалуйста, как такую сортировку реализовать?

    Вернуться к началу

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

    Re: Сортировка связанных по промежуточной таблице

    • Цитата

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

    return $this->hasMany(\app\models\Image::className(), ['id'=>'image_id'])->viaTable('{{%gallery_images}} gallery_images', ['gallery_id'=>'id'])->orderBy('gallery_images.sort'); как-то так.
    А может и нет - надо тестировать.

    Вернуться к началу

    Noobie Сообщения: 29 Зарегистрирован: 2014.06.03, 13:38

    Re: Сортировка связанных по промежуточной таблице

    • Цитата
    Неа, так не получается.
    Как только встала задача сортировки, сразу попробовал так:

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

    public function getImages() { return $this->hasMany(\app\models\Image::className(), ['id'=>'image_id'])->viaTable('{{%gallery_images}}', ['gallery_id'=>'id'])->orderBy('{{%gallery_images}}.sort'); } выдает ошибку

    Database Exception – yii\db\Exception
    SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tbl_gallery_images.sort' in 'order clause'
    The SQL being executed was: SELECT FROM `tbl_images` WHERE `id` IN ('1', '2', '3', '4', '5') ORDER BY `tbl_gallery_images`.sort

    То есть все таки идет попытка найти это поле в таблице images

    Вернуться к началу

    codrilla Сообщения: 173 Зарегистрирован: 2013.03.06, 12:24 Откуда: Молдова, Тирасполь

    Re: Сортировка связанных по промежуточной таблице

    • Цитата
    Я бы связь оставил как есть, а выборку делал бы следующим образом

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

    Gallery::find()->with([ 'images' => function($query) { $query->orderBy('sort'); }, ]);

    Вернуться к началу

    codrilla Сообщения: 173 Зарегистрирован: 2013.03.06, 12:24 Откуда: Молдова, Тирасполь

    Re: Сортировка связанных по промежуточной таблице

    • Цитата
    А в вашем примере надо вероятно писать так:

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

    public function getImages() { return $this->hasMany(\app\models\Image::className(), ['id'=>'image_id'])->viaTable('{{%gallery_images}}', ['gallery_id'=>'id'])->orderBy('sort'); }

    Вернуться к началу

    codrilla Сообщения: 173 Зарегистрирован: 2013.03.06, 12:24 Откуда: Молдова, Тирасполь

    Re: Сортировка связанных по промежуточной таблице

    • Цитата

    А, виноват, у вас сортировка в связующей таблице, а не в таблице изображений. Тогда мой вариант неверен.

    Вернуться к началу

    prot Сообщения: 34 Зарегистрирован: 2013.12.26, 21:02 Контактная информация: Контактная информация пользователя prot

    Re: Сортировка связанных по промежуточной таблице

    • Цитата

    Это можно сделать.
    Но тогда теряется логика в сущностях. Сущность Image - не должна ничего знать о сортировке, ее это не интересует, она отвечает только за фотографию (как минимум id и путь к файлу). А вот Gallery (Gallery_Image) - отвечает за фотографии и сортировку в каждой конкретной Галерее.

    Вернуться к началу

    aquy Сообщения: 48 Зарегистрирован: 2014.08.21, 09:35

    Re: Сортировка связанных по промежуточной таблице

    • Цитата

    Есть еще один не менее интересный вариант, чтобы не задумываться над сложными конструкциями сортировки и фильтрации можно сделать в самой БД нужное представление, из этого представления сгенерировать модель и сеарчмодель и уже сортировать и фильтровать как будто бы это одна таблица.

    Вернуться к началу

    pavlm Сообщения: 70 Зарегистрирован: 2013.09.02, 16:33

    Re: Сортировка связанных по промежуточной таблице

    • Цитата
    вот такой вариант есть:

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

    $g = Gallery::find()->with(['galleryImages', 'galleryImages.image'])->one(); $imgs = ArrayHelper::getColumn($g->galleryImages, 'image');

    Вернуться к началу

    Noobie Сообщения: 29 Зарегистрирован: 2014.06.03, 13:38

    Re: Сортировка связанных по промежуточной таблице

    • Цитата

    Я задачу решил, но как именно реализовал сейчас не вспомню. Поищу у себя исходники того проекта, где это реализовывал, выложу.
    yii2 сортировка по связанным таблицам Точно помню что без join'ов у меня было, но само решение как по мне, являлось костылем.

    Вернуться к началу

    Noobie Сообщения: 29 Зарегистрирован: 2014.06.03, 13:38

    Re: Сортировка связанных по промежуточной таблице

    • Цитата
    Вот так я реализовал это тогда, в модель Gallery добавил метод getImages, код:

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

    public function getImages() { if($this->isNewRecord) return false; // получаем id изображений, отсортированных по полю 'sort' и формируем условие IN $image_ids = GalleryImage::find()->select('image_id')->asArray()->where('gallery_id='.$this->id)->orderBy('sort')->all(); $in = ''; foreach($image_ids as $item){ $in.= $item['image_id'].', '; } $in = trim( trim($in), ', ' ); $query = new \Yii\db\Query(); $query->from('{{%images}}'); $query->where("id IN ($in)"); $query->orderBy("FIELD (id, $in)"); $sql = str_replace('`', '', $query->createCommand()->sql); $models = \app\modules\gallery\models\Image::findBySql($sql)->all(); return $models; }

    Вернуться к началу

    Tpona Сообщения: 218 Зарегистрирован: 2011.06.05, 19:00

    Re: Сортировка связанных по промежуточной таблице

    • Цитата
    Где-то нашел вот такой код, но он не работает:

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

    public function getSavedQuestions() { return $this->hasMany(Question::className(), ['id' => 'questionId']) ->viaTable('{{%interview_question}}', ['interviewId' => 'id'], function($query){ return $query->orderBy(['{{%interview_question}}.sort' => SORT_ASC]); })->where(['saved' => 1]); } Кто-то нашел решение, как сделать именно связь а не выборку путем построения запроса?

    Вернуться к началу

    Tpona Сообщения: 218 Зарегистрирован: 2011.06.05, 19:00

    Re: Сортировка связанных по промежуточной таблице

    • Цитата
    Впринципе, как то так можно сделать все работает

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

    return Question::find() ->select('{{%question}}.') ->innerJoin( '{{%interview_question}}', '{{%interview_question}}.questionId={{%question}}.id' ) ->where('{{%question}}.saved=1') ->orderBy(['{{%interview_question}}.sort' => SORT_ASC]) ->all();

    Вернуться к началу

    Создано на основе phpBB® Forum Software © phpBB Limited
    Русская поддержка phpBB
    GZIP: Off

     


    Источник: http://yiiframework.ru/forum/viewtopic.php?t=18651



    Рекомендуем посмотреть ещё:


    Закрыть ... [X]

    И снова про фильтр и сортировку связанных моделей в Yii 2 если позволите Плетение кос клину

    Yii2 сортировка по связанным таблицам Yii 2 Сортировка по убыванию и возрастанию - в прямом и обратном порядке
    Yii2 сортировка по связанным таблицам Yii 2 - получить связанные данные с сортировкой по группам и весу групп
    Yii2 сортировка по связанным таблицам Php - сортировка по вычисляемому столбцу связанной таблицы gridview
    Yii2 сортировка по связанным таблицам Сортировка связанных по промежуточной таблице - Yii Framework Форум
    Yii2 сортировка по связанным таблицам Работа с запросами в Yii 2.x. Запрос выборки при работе с моделью
    Yii2 сортировка по связанным таблицам Как в Yii 2 работать со связанными таблицами при помощи ActiveRecord?
    Yii2 сортировка по связанным таблицам Как правильно сделать фильтр поиска и сортировку в GridView
    Yii2 сортировка по связанным таблицам Отображение данных взаимосвязанных таблиц в Yii 2 PHP lessons
    Yii2 сортировка по связанным таблицам Yii 2 GridView сортировка по умолчанию - "Fuck" задачи
    YII 2 Сортировка в GridView по нескольким полям Связанные модели в GridView Yii 2 Арт-Дегустация. Арт-Вечеринки, мастер-классы по Всё самое модное, интересное и вкусное вы найдёте Вязание спицами - Возможно ли распустить полотно с начала вязания Заправка оверлока Merrylock Видео на Запорожском портале Как связать подушку крючком, схемы и подробное описание Лечение грязью в домашних условиях. Лечение грязями

    Похожие новости