Når du støder på forespørgselsproblemer, skal du kontrollere, hvilke forespørgsler der rent faktisk genereres (f.eks. ved hjælp af DebugKit ). Medmindre det er et udtryksobjekt, vil højre side af en betingelse altid være bundet som en parameter, dvs. du sammenligner med en streng-literal:
Pupils.school_id = 'Schools.id'
Generelt skal kolonnenavne være identifikationsudtryk for at sikre korrekt autocitatkompatibilitet. Mens venstre side automatisk vil blive håndteret korrekt, skal højre side håndteres manuelt.
I dit specifikke tilfælde kunne du nemt bruge QueryExpression::equalFields()
, som er ment for præcis, hvad du prøver at gøre, sammenligne felter/kolonner:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
Det er også muligt at oprette identifikationsudtryk manuelt ved blot at instansiere dem:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
eller fra CakePHP 3.6 via Query::identifier()
metode:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
Og endelig kan du også altid sende en enkelt strengværdi, som grundlæggende er indsat i forespørgslen som rå SQL, men i så fald vil identifikatorerne ikke være genstand for automatisk identifikationscitering:
->where([
'Pupils.school_id = Schools.id'
])
Se også
- Kogebog> Databaseadgang &ORM> Query Builder> Avancerede betingelser
- API> \Cake\ Database\Expression\QueryExpression::equalFields()
- API> \Cake\Database\ Expression\IdentifierExpression