Я хочу выбрать 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()
сделает ответ неверным.
что произойдет, если вы удалите часть select
и выберите все, что я думаю, она покажет вам правильное количество записей?
Вероятно, это связано с тем, что 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');
может быть, что в объединенном запросе всего 5 строк