Как упоминалось в комментариях, записи hasMany
ассоциаций (и belongsToMany
в этом отношении) всегда будут извлекаться в отдельном запросе при использовании contain()
.
Если вам нужно создать объединения с такой связью, вы должны явно использовать соответствующие функции для объединений, например leftJoinWith()
:
$this->AclGroups->find('all')->leftJoinWith('AclPermissions');
Это создаст запрос, похожий на тот, который вы показываете. Однако он также будет генерировать условия по умолчанию, используя настроенный внешний ключ, вам придется отключить внешний ключ, чтобы избежать этого, например:
$this->hasMany('AclPermissions', [
'foreignKey' => false, // << like this
// ...
]);
Учитывая, что условия связывания не будут работать с contain()
(а отключение внешнего ключа сделает его еще более непригодным для этой цели), вы можете создать отдельную связь для целей присоединения или использовать " методы соединения нижнего уровня, где вы указываете все условия вручную (вы можете, например, поместить это в пользовательский искатель, чтобы сохранить ваш код СУХИМЫМ):
$query = $this->AclGroups
->find('all')
->join([
'table' => 'acl_permissions',
'alias' => 'AclPermissions',
'type' => 'LEFT',
'conditions' => [
'AclPermissions.permission & AclGroups.permission != :permission'
]
])
->bind(':permission', 0, 'integer');
Обратите внимание, что значение здесь явно связано, чтобы гарантировать, что используется правильный тип, так как его нельзя определить по нестандартному левому значению (которое на самом деле не содержит фрагментов SQL - вы может захотеть посмотреть на использование выражений).
Смотри также