Как правильно сделать связи и запрос в controller?

Yii - это мощный фреймворк для разработки веб-приложений на PHP. В Yii есть удобный способ установить связи между моделями и выполнять запросы в контроллере.

Для установки связей между моделями Yii предлагает использовать методы relations() и relationNames() в классе модели. Эти методы позволяют определить тип связи между моделями (один-к-одному, один-ко-многим, многие-ко-многим) и указать соответствующие атрибуты связи.

Наиболее распространенные типы связей, которые можно установить с использованием Yii, включают следующие:

1. Один-к-одному (One-to-One) связь - это, когда одна запись в одной таблице модели связана с одной записью в другой таблице модели. Используйте метод hasOne() в методе relations() в классе модели:

public function relations()
{
    return array(
        'address' => array(self::HAS_ONE, 'Address', 'user_id'),
    );
}

2. Один-ко-многим (One-to-Many) связь - это, когда одна запись в одной таблице модели связана с несколькими записями в другой таблице модели. Используйте метод hasMany() в методе relations() в классе модели:

public function relations()
{
    return array(
        'posts' => array(self::HAS_MANY, 'Post', 'user_id'),
    );
}

3. Многие-ко-многим (Many-to-Many) связь - это, когда несколько записей в одной таблице модели связаны с несколькими записями в другой таблице модели, через таблицу-посредник. Используйте метод MANY_MANY() в методе relations() в классе модели:

public function relations()
{
    return array(
        'tags' => array(self::MANY_MANY, 'Tag', 'post_tag(post_id, tag_id)'),
    );
}

После того, как связи установлены, вы можете использовать их в контроллере при выполнении запросов к моделям.

Для выполнения запросов к связанным моделям существует несколько способов. Один из них - использование метода with() или joinWith() в методе контроллера:

$users = User::model()->with('address')->findAll();

Этот запрос вернет всех пользователей вместе с их адресами.

Другой способ - использование методов, сгенерированных Yii для связей. Например, если у вас есть One-to-Many связь между пользователем и его постами, вы можете получить все посты пользователя следующим образом:

$user = User::model()->findByPk($userId);
$posts = $user->posts;

Этот запрос вернет массив всех постов пользователя.

Yii предоставляет множество инструментов для работы с связанными моделями и выполнения запросов в контроллере. Документация Yii содержит подробную информацию по каждому из этих методов и примеры их использования.