Как выбрать поля содержимого ассоциации?

Я хотел бы выполнить следующий запрос, где я хотел бы прочитать только необходимые поля из связанных.
Я использовал точечную запись в 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 ответ

Решение

Вы должны настроить содержимое индивидуально, выбор полей для других объектов не будет работать.

Если быть точным, вы не можете выбрать поля для содержимого в другом месте, кроме соответствующей конфигурации содержимого, за исключением belongsTo/hasOne ассоциации, использующие стратегию объединения, поля для них можно выбрать в select() вызов непосредственного "родительского" запроса, так как эти ассоциации будут получены через соединение в этом запросе.

Если например Sites будет belongsTo ассоциации, то вы можете выбрать поля для этого через select() позвонить на Orders, Если Users будет belongsTo, но Sites hasManyтогда вы могли бы использовать select() звать Sites выбрать поля для Users,

Это, как говорится, в вашем случае вы либо используете 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'
            ]
        ]
    ]
])

Смотрите также

Другие вопросы по тегам