Wanneer u queryproblemen tegenkomt, controleer dan welke query's daadwerkelijk worden gegenereerd (bijvoorbeeld met behulp van DebugKit ). Tenzij het een expressieobject is, wordt de rechterkant van een voorwaarde altijd als parameter gebonden, dat wil zeggen dat u vergelijkt met een letterlijke tekenreeks:
Pupils.school_id = 'Schools.id'
Voor een goede compatibiliteit met automatische aanhalingstekens moeten kolomnamen in het algemeen identifier-expressies zijn. Terwijl de linkerkant automatisch correct zal worden behandeld, zou de rechterkant handmatig moeten worden behandeld.
In jouw specifieke geval zou je gemakkelijk QueryExpression::equalFields()
. kunnen gebruiken , wat precies bedoeld is voor wat u probeert te doen, velden/kolommen vergelijken:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
Het is ook mogelijk om identificatie-expressies handmatig te creëren door ze simpelweg te instantiëren:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
of vanaf CakePHP 3.6 via de Query::identifier()
methode:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
En ten slotte kunt u ook altijd een enkele tekenreekswaarde doorgeven, die in feite in de query wordt ingevoegd als onbewerkte SQL, maar in dat geval worden de identifiers niet onderworpen aan automatische identifier-citaten:
->where([
'Pupils.school_id = Schools.id'
])
Zie ook
- Kookboek> Databasetoegang &ORM> Query Builder> Geavanceerde voorwaarden
- API> \Cake\ Database\Expression\QueryExpression::equalFields()
- API> \Cake\Database\ Expressie\IdentifierExpression