Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie vergleiche ich zwei Felder/Spalten in einer Bedingung?

Wenn Abfrageprobleme auftreten, überprüfen Sie, welche Abfragen tatsächlich generiert werden (zum Beispiel mit DebugKit ). Sofern es sich nicht um ein Ausdrucksobjekt handelt, wird die rechte Seite einer Bedingung immer als Parameter gebunden, dh Sie vergleichen mit einem Zeichenfolgenliteral:

Pupils.school_id = 'Schools.id'

Im Allgemeinen sollten Spaltennamen für eine ordnungsgemäße Kompatibilität mit automatischen Zitaten Bezeichnerausdrücke sein. Während die linke Seite automatisch korrekt gehandhabt wird, müsste die rechte Seite manuell gehandhabt werden.

In Ihrem speziellen Fall könnten Sie einfach QueryExpression::equalFields() verwenden , was genau das ist, was Sie versuchen, Felder/Spalten zu vergleichen:

->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
    return $exp->equalFields('Pupils.school_id', 'Schools.id');
})

Es ist auch möglich, Bezeichnerausdrücke manuell zu erstellen, indem Sie sie einfach instanziieren:

->where([
    'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])

oder ab CakePHP 3.6 über die Query::identifier() Methode:

->where([
    'Pupils.school_id' => $query->identifier('Schools.id')
])

Und schließlich könnten Sie auch immer einen einzelnen String-Wert übergeben, der grundsätzlich als Raw-SQL in die Abfrage eingefügt wird, aber in diesem Fall werden die Bezeichner nicht dem automatischen Bezeichner-Quoting unterzogen:

->where([
    'Pupils.school_id = Schools.id'
])

Siehe auch