Всеки път, когато срещнете проблеми със заявките, проверете какви заявки всъщност се генерират (например с помощта на DebugKit ). Освен ако не е изразен обект, дясната страна на условието винаги ще бъде обвързана като параметър, т.е. сравнявате с низов литерал:
Pupils.school_id = 'Schools.id'
По принцип за правилна съвместимост с автоматично цитиране имената на колоните трябва да бъдат изрази на идентификатор. Докато лявата страна автоматично ще се обработва правилно, дясната ще трябва да се обработва ръчно.
Във вашия конкретен случай можете лесно да използвате QueryExpression::equalFields()
, което се отнася точно за това, което се опитвате да направите, сравнявайки полета/колони:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
Възможно е също така да създавате ръчно изрази на идентификатор, като просто ги инстанцирате:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
или от CakePHP 3.6 чрез Query::identifier()
метод:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
И накрая, винаги можете да предавате стойност на един низ, която основно се вмъква в заявката като необработен SQL, но в този случай идентификаторите няма да бъдат обект на автоматично цитиране на идентификатор:
->where([
'Pupils.school_id = Schools.id'
])
Вижте също
- Cookbook> Достъп до база данни и ORM> Създател на заявки> Разширени условия
- API> \Cake\ База данни\Expression\QueryExpression::equalFields()
- API> \Cake\Database\ Expression\IdentifierExpression