Tôi đang cố gắng hành xử. Vì vậy, thay vì sử dụng cú pháp SQL sau:Làm thế nào để lồng ghép với CakePHP?
select *
from tableA INNER JOIN
tableB on tableA.id = tableB.tableA_id LEFT OUTER JOIN
(tableC INNER JOIN tableD on tableC.tableD_id = tableD.id)
on tableC.tableA_id = tableA.id
Tôi muốn sử dụng CakePHP model->find()
. Điều này cũng sẽ cho phép tôi sử dụng Paginator
, vì điều đó sẽ không hoạt động với các truy vấn SQL tùy chỉnh theo như tôi hiểu (trừ khi bạn mã hóa một truy vấn phân trang đơn lẻ thành mô hình có vẻ không phù hợp với tôi).
Những gì tôi đã cố gắng cho đến nay:
/* inside tableA_controller.php, inside an action, e.g. "view" */
$this->paginate['recursive'] = -1; # suppress model associations for now
$this->paginate['joins'] = array(
array(
'table' => 'tableB',
'alias' => 'TableB',
'type' => 'inner',
'conditions' => 'TableB.tableA_id = TableA.id',
),
array(
'table' => 'tableC',
'alias' => 'TableC',
'type' => 'left',
'conditions' => 'TableC.tableA_id = TableA.id',
'joins' = array(# this would be the obvious way to do it, but doesn't work
array(
'table' => 'tableD',
'alias' => 'TableD',
'type' => 'inner',
'conditions' => 'TableC.tableD_id = TableD.id'
)
)
)
)
Đó là, làm tổ trong tham gia vào cấu trúc. Nhưng điều đó không hiệu quả (CakePHP chỉ bỏ qua phần tử lồng nhau là 'joins'
mà là loại mà tôi mong đợi, nhưng thật buồn.
Tôi đã thấy các gợi ý về cách thực hiện truy vấn phụ (trong mệnh đề where
) bằng cách sử dụng trình tạo câu lệnh . một thủ thuật tương tự có thể được sử dụng ở đây
Tại sao phải lồng nhau? Bạn không thể làm điều tương tự với tất cả các gia nhập ở cấp cao nhất? –
Tôi ước tôi có thể, nhưng kết quả là khác nhau: Tôi muốn tất cả các kết quả từ việc kết nối bên trong cấp cao nhất với dữ liệu tùy chọn được gắn vào từ kết nối bên trong lồng nhau. Nếu tôi flatten này, sau đó tôi mất bất kỳ hàng trong (TableA bên trong tham gia TableB) mà không có TableD tương ứng ... –
Wow đó là khá phức tạp. Tôi có lẽ sẽ cố gắng và mở rộng find() bằng cách nào đó để thêm một số tham số thêm –