cakephp3。可容纳选择

cakephp3。可容纳选择,cakephp,orm,cakephp-3.0,contain,Cakephp,Orm,Cakephp 3.0,Contain,我有一个多对多关系,其中培训计划可以包含许多练习。它们是通过链接表ExercisesTrainingPrograms链接的 我想从练习中选择某些字段: $trainingPrograms = $this->TrainingPrograms->find() ->contain(['Exercises' => function ($q) { return $q ->selec

我有一个多对多关系,其中培训计划可以包含许多练习。它们是通过链接表ExercisesTrainingPrograms链接的

我想从练习中选择某些字段:

$trainingPrograms = $this->TrainingPrograms->find()
            ->contain(['Exercises' => function ($q) {
                return $q
                    ->select(['id','name','description']);
            }
            ])
            ->select(['id','name','description'])
            ->where(['user_id' => $this->Auth->user('id')]);
我得到的结果如下所示:

   "trainingPrograms": [
            {
                "id": 1,
                "name": "Monday Madness",
                "description": "hes",
                "exercises": [
                    {
                        "id": 2,
                        "name": "Barbell Bench Press",
                        "description": "Medium grip ",
                        "exercise_categories_id": 2,
                        "exercise_difficulties_id": 1,
                        "created": "2015-09-16T07:07:01+0000",
                        "modified": "2015-09-16T07:07:01+0000",
                        "_joinData": {
                            "exercise_id": 2,
                            "id": 28,
                            "training_program_id": 1,
                            "created": "2015-10-07T15:45:49+0000"
                        }
                    },
                    {
                        "id": 2,
                        "name": "Barbell Bench Press",
                        "description": "Medium grip ",
                        "exercise_categories_id": 2,
                        "exercise_difficulties_id": 1,
                        "created": "2015-09-16T07:07:01+0000",
                        "modified": "2015-09-16T07:07:01+0000",
                        "_joinData": {
                            "exercise_id": 2,
                            "id": 35,
                            "training_program_id": 1,
                            "created": "2015-10-07T19:58:12+0000"
                        }
                    }
                ]
            }]

正如你所看到的,我得到了练习表的所有字段,而不是我要求的字段。为什么,我做错了什么

如果未通过
字段
选项定义字段,则关联将启用
查询::自动字段()
。这是必要的,因为外键(
exercise\u id
)正在添加到
SELECT
子句中,否则将导致不选择其他字段(不确定在哪个上下文中实际需要此字段)

请参见

稍后将调用包含关联的回调,因此您必须禁用
autoFields()
,以便能够通过查询生成器限制所选字段

->contain(['Exercises' => function ($q) {
    return $q
        ->select(['id','name','description'])
        ->autoFields(false);
}

我真的说不出这是不是有意的行为。您可能需要打开一个问题进行澄清,或者在IRC上询问。

文档似乎表明此功能是在3.1中添加的。@GregSchmidt文档所指的是将关联类实例传递给
Query::select()
,这与问题中描述的问题不同。谢谢,你的解释很有道理:)!谢谢你救了我一天。