Как выбрать данные из таблицы со связями в yii2?

Пользователь

от magdalen_kub , в категории: PHP , год назад

Как выбрать данные из таблицы со связями в yii2?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от josie , год назад

@magdalen_kub 

В Yii2 для выборки данных из таблицы со связями можно использовать методы Active Record или Query Builder.


Например, если у вас есть две таблицы "post" и "category", и между ними связь "один ко многим", где один пост может принадлежать нескольким категориям, то для выборки всех постов и связанных с ними категорий можно использовать следующий код:

1
2
3
4
5
use appmodelsPost;

$posts = Post::find()
    ->with('categories')
    ->all();


В данном примере метод with() используется для указания, что нужно загрузить связанные данные из таблицы "category". Также можно использовать метод joinWith() для выборки данных из связанных таблиц с помощью объединения (join).


Если у вас есть более сложные связи, например, "многие ко многим" или "один ко многим" через промежуточную таблицу, то можно использовать методы via() и viaTable(). Например:

1
2
3
4
5
6
use appmodelsPost;

$posts = Post::find()
    ->joinWith('tags')
    ->where(['tags.name' => 'php'])
    ->all();


В данном примере мы выбираем все посты, связанные с тегом "php" через таблицу "post_tag", которая является промежуточной таблицей между таблицами "post" и "tag". Для этого мы используем метод joinWith(), который загружает связанные данные из таблицы "tag", и метод where(), который фильтрует посты по имени тега.


Также можно использовать методы hasOne(), hasMany() и belongsTo() для указания типа связи и ее параметров, например:

1
2
3
4
5
6
7
use appmodelsPost;
use appmodelsCategory;

$category = Category::findOne(1);
$posts = $category->getPosts()
    ->orderBy('created_at DESC')
    ->all();


В данном примере мы выбираем все посты, принадлежащие категории с id равным 1. Для этого мы используем метод getPosts(), который возвращает объект запроса для выборки данных из таблицы "post", связанных с данной категорией через связь "один ко многим". Затем мы используем метод orderBy() для сортировки результатов по дате создания поста.