2016-07-20 3 views
1

У меня есть 3 стола: sp_pages, sp_messages и sp_messages_pages (для отношений «многие ко многим»). sp_messages_pages таблица имеет 5 колонок:Yii2. Как сортировать результаты по атрибутам в таблице соединений?

  • идентификаторов
  • page_id
  • message_id
  • включен
  • порядок_сортировки

Я хочу, чтобы все сообщения для конкретной сортировки страницы по sp_messages_pages.sorting_order с помощью Yii2.

Я пытаюсь этот код в pages классе:

public function getMessages() { 
    return $this->hasMany(Messages::className(), ['id' => 'id_messages']) 
    ->viaTable('sp_messages_pages', ['id_pages' => 'id'], function ($query) { 
     $query->andWhere(['enabled' => 'Yes']) 
       ->orderBy(['sp_messages_pages.sorting' => SORT_ASC]); 
    }); 
} 

Я использую этот код в мой контроллер:

$this->findModel(['slug' => $slug])->getMessages(); 

Это дает мне все сообщения, отсортированные по sp_message.id. Сгенерированный SQL является

SELECT * FROM sp_messages WHERE id IN ('2', '3', '1', '4', '5')

IN состояние сортируется, как я хочу, но как сортировать sp_messages?

+0

проверьте это http://stackoverflow.com/questions/38355984/yii2-order-items-of-many-to-many-relation/38367858 в той же теме – oakymax

ответ

0

Первый способ - присоединение отношение к таблице уже выбран messages

$this->hasMany(Messages::className(), ['id' => 'id_messages']) 
    ->viaTable('sp_messages_pages', ['id_pages' => 'id'], 
     function ($query) { 
      $query->andWhere(['enabled' => 'Yes']); 
     } 
    ) 
    ->leftJoin('sp_messages_pages MP', 'MP.id_messages = sp_messages.id') 
    ->orderBy(['MP.sorting' => SORT_ASC]); 

почти тот же самый вопрос здесь: Yii2 order items of many-to-many relation

Другой способ - с помощью findBySql

$sql = " 
    SELECT m.* FROM sp_messages AS m 
    JOIN WITH sp_messages_pages AS mp ON mp.id_messages = m.id 
    JOIN WITH sp_pages AS p ON p.id = mp.id_pages 
    WHERE mp.enabled = 'Yes' AND p.id = :page_id 
    ORDER BY mp.sorting ASC 
"; 

return Messages::findBySql($sql, [':page_id' => $this->id]); 

, но это не будет в терминологии Yii, только метод, который возвращает ActiveQuery для дальнейшей работы. Например, вы можете использовать такой метод, как $page->getMessages()->all().

+0

Извините, имя таблицы отношений 'sp_messages_pages'. К сожалению, код для меня не работает, бот начал учиться через + join .. – Psyhos

+0

@Psyhos также вы можете попробовать сделать это с помощью метода 'findBySql': http://www.yiiframework.com/doc-2.0/yii- db-activerecord.html # findBySql() - detail – oakymax

+0

@Psyhos, почему это не работает? какая-то ошибка здесь? – oakymax

Смежные вопросы