Setiap kali mengalami masalah kueri, periksa kueri apa yang sebenarnya dibuat (misalnya menggunakan DebugKit ). Kecuali menjadi objek ekspresi, sisi kanan kondisi akan selalu terikat sebagai parameter, yaitu Anda membandingkan dengan string literal:
Pupils.school_id = 'Schools.id'
Umumnya untuk kompatibilitas kutipan otomatis yang tepat, nama kolom harus berupa ekspresi pengenal. Sementara sisi kiri secara otomatis akan ditangani dengan benar, sisi kanan harus ditangani secara manual.
Dalam kasus khusus Anda, Anda dapat dengan mudah menggunakan QueryExpression::equalFields()
, yang tepat untuk apa yang Anda coba lakukan, membandingkan bidang/kolom:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
Anda juga dapat membuat ekspresi pengenal secara manual hanya dengan membuat instance:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
atau pada CakePHP 3.6 melalui Query::identifier()
metode:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
Dan akhirnya Anda juga dapat selalu memberikan nilai string tunggal, yang pada dasarnya dimasukkan ke dalam kueri sebagai SQL mentah, namun dalam hal ini pengidentifikasi tidak akan tunduk pada kutipan pengenal otomatis:
->where([
'Pupils.school_id = Schools.id'
])
Lihat juga
- Buku Masak> Akses Basis Data &ORM> Pembuat Kueri> Ketentuan Lanjutan
- API> \Cake\ Database\Expression\QueryExpression::equalFields()
- API> \Cake\Database\ Ekspresi\IdentifierExpression