我想在我的数据库中选择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条记录。
UPDATE1:
当我删除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()
查询将导致响应错误
答案 0 :(得分:0)
这可能是因为Course
与多个项目有hasMany
关系。因此,如果您Course
包含2 requirement
次,则此类查询将返回2行,每个Course
数据都包含重复的requirement
数据。重复数据合并为一个Course
模型,因此2行成为一个模型。这正是这里发生的事情 - 查询返回20行,但它只有5个唯一的Course
模型。
如果您不需要访问SQL查询中的关系(例如进行过滤),则可以将joinWith()
替换为with()
- 它不会对SQL执行JOIN
查询,只注册关系的急切加载。您可以阅读有关这两种方法之间差异的更多信息here。
如果您需要此JOIN
,则应该按Course
ID对结果进行分组,以避免重复Course
行。
$query->groupBy('t.id');