Ограничение не работает в запросе yii2

Я хочу выбрать 20 записей в своей базе данных, поэтому я использую для этого следующий код:

$query = Course::find()
                        ->alias("t")
                        ->select([
                            't.id', 't.subtitle', 't.title',
                            't.info', 't.skill_level_id', 't.special',
                            't.created', 't.modified', 't.price',
                            't.training_type_id', 't.media_id', 't.instructor_id',
                            't.extension_type'
                        ])
                        ->where(["t.deleted" => 0])
                        ->joinWith([
                            'skillLevel', "courseTarget", "requirement", 'categoryCourses', "media",
                            "instructor", "trainingType"
                        ]);
        $query->limit(20);
        return $query->all();

но этот код выберет всего 5 записей,

Когда я удаляю часть joinWith, мой код работает нормально и выбирает 20 записей. Измененный код:

   $query = Course::find()
                    ->alias("t")
                    ->select([
                        't.id', 't.subtitle', 't.title',
                        't.info', 't.skill_level_id', 't.special',
                        't.created', 't.modified', 't.price',
                        't.training_type_id', 't.media_id', 't.instructor_id',
                        't.extension_type'
                    ])
                    ->where(["t.deleted" => 0]);
    $query->limit(20);
    return $query->all();

Измененный код вернет 20 записей.

ОБНОВЛЕНИЕ1:

Когда я удаляю limit(20), он вернет записи 496, но когда я добавил limit(20), он просто вернет 5.

$query = Course::find()
                        ->alias("t")
                        ->select([
                            't.id', 't.subtitle', 't.title',
                            't.info', 't.skill_level_id', 't.special',
                            't.created', 't.modified', 't.price',
                            't.training_type_id', 't.media_id', 't.instructor_id',
                            't.extension_type'
                        ])
                        ->where(["t.deleted" => 0])
                        ->joinWith([
                            'skillLevel', "courseTarget", "requirement", 'categoryCourses', "media",
                            "instructor", "trainingType"
                        ]);
        return $query->all()

Этот код работает нормально и возвращает все, но запрос limit() сделает ответ неверным.

может быть, что в объединенном запросе всего 5 строк

scaisEdge 11.04.2018 14:49

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

Reborn 12.04.2018 03:24
1
2
334
1

Ответы 1

Вероятно, это связано с тем, что Course связаны с hasMany с несколькими элементами. Итак, если у вас есть Course с 2 requirement, такой запрос вернет 2 строки с дублированными данными Course для каждого requirement. Дублированные данные объединяются в одну модель Course, поэтому 2 строки становятся одной моделью. Именно это и произошло здесь - запрос возвращает 20 строк, но в нем всего 5 уникальных моделей Course.

Если вам не нужен доступ к отношениям в SQL-запросе (например, для фильтрации), вы можете заменить joinWith() на with() - он не будет выполнять JOIN в SQL-запросе, только зарегистрирует нетерпеливую загрузку для отношений. Вы можете узнать больше о различиях между этими двумя методами здесь.

Если вам нужен этот JOIN, вам, вероятно, следует сгруппировать результаты по идентификатору Course, чтобы избежать дублирования строк Course.

$query->groupBy('t.id');

Другие вопросы по теме