@link_irk

ActiveRecord: Как выборать данные по условию через связующую таблицу?

Здравствуйте.
У меня 3 сайта на Yii2, работают на одном движке, на одной базе, потому как большая часть данных пересекается.
Конфигурация: advanced
Структура БД следующая:
8XowKWN.png
В frontend/web/index.php получаю модель сайта:
$site = Sites::find() -> where(['domain' => 'http://'.$_SERVER['HTTP_HOST']]) -> one();
Yii::$app -> params['site'] = $site;

В модели Sites имею геттер:
public function getNews()
{
    return $this->hasMany(News::className(), ['id' => 'news_id'])->viaTable('site_news', ['site_id' => 'id']);
}

Соответственно в любом месте могу получить новости, связанные именно с этим сайтом, обратившись $news = Yii::$app -> params['site'] -> news и получив коллекцию объектов News
Но как быть, если мне нужно извлечь не все новости, а например только 2 или же выбрать новости, удовлетворяющие какому-либо условию?
И вообще правильна ли такая организация моделей?
Спасибо
  • Вопрос задан
  • 2358 просмотров
Решения вопроса 1
fornit1917
@fornit1917
getNews возвращает на самом деле не список новостей, а объект query, на который можно навешать дополнительных условий, прежде чем сделать выборку.
Пример получения двух последних новостей:
$news = Yii::$app->params['site']->getNews()->orderBy('id desc')->limit(2)->all()

Собственно запрос к базе и получение списка новостей происходит только на последнем шаге - при вызове all().

Пример добавления условия:
$news = Yii::$app->params['site']->getNews()->andWhere(['type' =>1])->all()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы