Kdykoli narazíte na problémy s dotazem, zkontrolujte, jaké dotazy se skutečně generují (například pomocí DebugKit ). Pokud se nejedná o objekt výrazu, pravá strana podmínky bude vždy vázána jako parametr, tj. porovnáváte s řetězcovým literálem:
Pupils.school_id = 'Schools.id'
Obecně platí, že pro správnou kompatibilitu automatických citací by názvy sloupců měly být výrazy identifikátoru. Zatímco s levou stranou bude automaticky správně zacházeno, s pravou stranou bude nutné manipulovat ručně.
Ve vašem konkrétním případě můžete snadno použít QueryExpression::equalFields()
, což je přesně to, co se snažíte udělat, porovnání polí/sloupců:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
Je také možné vytvořit výrazy identifikátorů ručně tím, že je jednoduše vytvoříte:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
nebo od CakePHP 3.6 prostřednictvím Query::identifier()
metoda:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
A nakonec můžete také vždy předat hodnotu jednoho řetězce, která se v zásadě vloží do dotazu jako nezpracovaný SQL, ale v takovém případě nebudou identifikátory podléhat automatickému citování identifikátorů:
->where([
'Pupils.school_id = Schools.id'
])
Viz také
- Kuchařka> Přístup k databázi a ORM> Tvůrce dotazů> Pokročilé podmínky
- API> \Cake\ Database\Expression\QueryExpression::equalFields()
- API> \Cake\Database\ Expression\IdentifierExpression