Ogni volta che si verificano problemi con le query, controlla quali query vengono effettivamente generate (ad esempio utilizzando DebugKit ). A meno che non sia un oggetto espressione, il lato destro di una condizione sarà sempre associato come parametro, ad esempio stai confrontando con una stringa letterale:
Pupils.school_id = 'Schools.id'
In genere, per una corretta compatibilità con le quotazioni automatiche, i nomi delle colonne dovrebbero essere espressioni di identificatore. Mentre il lato sinistro verrà gestito automaticamente correttamente, il lato destro dovrebbe essere gestito manualmente.
Nel tuo caso specifico potresti facilmente utilizzare QueryExpression::equalFields()
, che è esattamente ciò che stai cercando di fare, confrontando campi/colonne:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
È anche possibile creare manualmente espressioni di identificazione semplicemente istanziandole:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
o a partire da CakePHP 3.6 tramite Query::identifier()
metodo:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
E infine potresti anche passare sempre un singolo valore di stringa, che è fondamentalmente inserito nella query come SQL grezzo, tuttavia in tal caso gli identificatori non saranno soggetti a virgolette automatiche degli identificatori:
->where([
'Pupils.school_id = Schools.id'
])
Vedi anche
- Ricettario> Accesso al database e ORM> Generatore di query> Condizioni avanzate
- API> \Cake\ Database\Espressione\QueryExpression::equalFields()
- API> \Cake\Database\ Espressione\EspressioneIdentificatore