Bất cứ khi nào gặp sự cố truy vấn, hãy kiểm tra xem những truy vấn nào thực sự đang được tạo (ví dụ:sử dụng DebugKit ). Trừ khi là một đối tượng biểu thức, phía bên phải của điều kiện sẽ luôn bị ràng buộc dưới dạng một tham số, tức là bạn đang so sánh với một chuỗi ký tự:
Pupils.school_id = 'Schools.id'
Nói chung để tương thích với trích dẫn tự động thích hợp, tên cột phải là biểu thức định danh. Trong khi phía bên tay trái sẽ tự động được xử lý đúng cách, phía bên tay phải sẽ yêu cầu được xử lý theo cách thủ công.
Trong trường hợp cụ thể của mình, bạn có thể dễ dàng sử dụng QueryExpression::equalFields()
, đề cập đến chính xác những gì bạn đang cố gắng thực hiện, so sánh các trường / cột:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
Cũng có thể tạo biểu thức định danh theo cách thủ công bằng cách khởi tạo chúng:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
hoặc kể từ CakePHP 3.6 thông qua Query::identifier()
phương pháp:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
Và cuối cùng, bạn cũng có thể luôn chuyển một giá trị chuỗi đơn, về cơ bản được chèn vào truy vấn dưới dạng SQL thô, tuy nhiên trong trường hợp đó, các số nhận dạng sẽ không phải tuân theo việc trích dẫn số nhận dạng tự động:
->where([
'Pupils.school_id = Schools.id'
])
Xem thêm
- Sách dạy nấu ăn> Truy cập cơ sở dữ liệu &ORM> Trình tạo truy vấn> Điều kiện nâng cao
- API> \ Cake \ Cơ sở dữ liệu \ Expression \ QueryExpression ::equalFields ()
- API> \ Cake \ Database \ Biểu thức \ Mã định danh