如何选择包含关联的字段?

时间:2016-02-29 18:04:59

标签: cakephp select query-builder cakephp-3.x

我想执行以下查询,我只想从关联中读取必要的字段 我在下面的select()中使用了点符号来更好地解释我想要的内容 基本上select()似乎只关注Users。是否可以指定Sites

的字段
$orders = $this->Orders->find()
    ->contain([
        'Sites.Users'=> function ($q) {
            return $q
                ->select([
                    'Sites.id',
                    'Sites.user_id',
                    'Users.id',
                    'Users.name',
                    'Users.owner_id',
                    'Users.firstname',
                    'Users.lastname'
                ])
                ->autoFields(false);
        },
    ])
    ->first();

1 个答案:

答案 0 :(得分:4)

您必须单独配置包含,选择其他包含的字段才能使用。

确切地说,您不能从相应的包含配置以外的任何地方选择包​​含的字段,唯一的例外是使用连接策略的belongsTo/hasOne关联,可以在{{}}中选择它们的字段{1}}致电直接"父母"查询,因为将通过该查询中的连接检索这些关联。

如果例如select()Sites关联,则可以通过belongsTo上的select()调用为其选择字段。如果OrdersUsersbelongsToSites,则您可以使用hasMany select()Sites调用Users {1}}。

话虽如此,在您的情况下,您可以使用queryBuilder选项在嵌套数组结构中定义回调

contain([
    'Sites' => [
        'queryBuilder' => function ($q) {
            return $q
                ->select([
                    'Sites.id',
                    'Sites.user_id'
                ]);
        },
        'Users' => function ($q) {
            return $q
                ->select([
                    'Users.id',
                    'Users.name',
                    'Users.owner_id',
                    'Users.firstname',
                    'Users.lastname'
                ]);
        }
    ]
])

或者,如果您实际上不需要查询构建器,请使用fields选项

contain([
    'Sites' => [
        'fields' => [
            'Sites.id',
            'Sites.user_id'
        ],
        'Users' => [
            'fields' => [
                'Users.id',
                'Users.name',
                'Users.owner_id',
                'Users.firstname',
                'Users.lastname'
            ]
        ]
    ]
])

另见