限制在yii2查询中不能很好地工作

时间:2018-04-11 11:18:27

标签: 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条记录。

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()查询将导致响应错误

1 个答案:

答案 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');