När du stöter på frågeproblem, kontrollera vilka frågor som faktiskt genereras (till exempel med DebugKit ). Såvida det inte är ett uttrycksobjekt, kommer den högra sidan av ett villkor alltid att vara bunden som en parameter, dvs du jämför med en bokstavlig sträng:
Pupils.school_id = 'Schools.id'
Generellt sett bör kolumnnamn vara identifierande uttryck för korrekt kompatibilitet med automatiska citat. Även om den vänstra sidan automatiskt kommer att hanteras korrekt, skulle den högra sidan behöva hanteras manuellt.
I ditt specifika fall kan du enkelt använda QueryExpression::equalFields()
, vilket är ment för exakt vad du försöker göra, jämföra fält/kolumner:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
Det är också möjligt att skapa identifieraruttryck manuellt genom att helt enkelt instansiera dem:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
eller från och med CakePHP 3.6 via Query::identifier()
metod:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
Och slutligen kan du också alltid skicka ett enstaka strängvärde, som i princip infogas i frågan som rå SQL, men i så fall kommer identifierarna inte att bli föremål för automatisk identifierare:
->where([
'Pupils.school_id = Schools.id'
])
Se även
- Kokbok> Databasåtkomst &ORM> Query Builder> Avancerade villkor
- API> \Cake\ Database\Expression\QueryExpression::equalFields()
- API> \Cake\Database\ Expression\IdentifierExpression