@sergey_zhuravlev_89

Как сделать связь один ко многим с ограниченным количеством полученных элементов из связанной таблице?

Реализовал два класса `ActiveRecord`. Первый `Countries`, а второй `Regions` и добавил в класс `Countries` связь один ко многим с таблицей `Regions`. Вот только когда я создаю, к примеру, такой запрос:
$countries = new \common\models\location\Countries();
$countries->find()
    ->where('id in(1, 2)') //Для получения двух стран по ID 1 (Россия) и 2 (Украина)
    ->with('regions')
    ->all());


Код выше работает как подобает, вот только он достаёт все связанные регионы. У России их 50, а у Украины 25 и этот запрос достаёт все. Если в самом методе `getRegions` (Метод для связи таблиц в классе `Countries`) я установлю ограничения в 10 пунктов при помощи `limit` метода, то я получу всего 10 пунктов, а нужно не больше 10 пунктов для каждого пункта родительского класса, в моём случае это для России и Украины. Как можно добиться подобного без реализации велосипедов и костылей?
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 3
proudmore
@proudmore
Я вижу для вас 2 варианта:
1. Попробовать написать запрос, который предоставит вам нужные данные, а потом, на основе этого запроса сгенерировать геттер, который отдаст вам нужные данные.
2. Сделать кастомный геттер сразу, циклом перебирая сущности и получая зависимости в нужном количестве.

Скорее всего, без понимания как устроен метод with() и прочее, у вас не выйдет реализовать геттеры так, чтобы их можно было использовать для жадной загрузки.
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
$countries = new \common\models\location\Countries();
$countries->find()
    ->where(['id' => [1, 2]]) //так как-то красивее
    ->joinWith('regions')
    ->all());

Оно?
Ответ написан
VerbAlexVlad
@VerbAlexVlad
Программист-любитель
$countries = (new \yii\db\Query())
    ->select(
        [
            'c.countries_name',
            'r.region_name',
        ])
    ->from(['c' => Countries::tableName()])
    ->innerJoin(['r' => 'region'], 'r.id = c.region_id')
    ->where(['in', 'c.id', ['1', '2']])
    ->all();


Как-то так, если я правильно понял что нужно
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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