Ok, đây là những gì tôi nghĩ đang diễn ra:
Việc bạn không sử dụng phép thuật quan hệ HABTM siêu hữu ích. Thay vì coi bảng này như một bảng quan hệ đơn thuần, cake sẽ chuyển đến mô hình được xác định.
Điều đó không sao khi bạn có một bảng HABTM phức tạp. Nhưng nếu đúng như vậy, mảng dữ liệu của bạn đã rối tung lên, vì bạn không thêm Question
và Qset
riêng biệt. Ý tôi là, việc bạn không làm
$data = array('Question'=>array('title'=>'new_question'),
'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);
Làm điều đó, bạn đã để cake giải quyết liên kết HABTM cho bạn và cấu trúc dữ liệu đó sẽ ổn. Nhưng bạn có mô hình QsetsQuestion của riêng mình trong thư mục mô hình. Vì vậy, dữ liệu bạn lưu sẽ giống với bất kỳ bảng nào khác, giống như vậy
$data = array('qset_id'=> $qset_id,
'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);
Và điều đó tạo ra một id mới trong bảng qsets_questions, với mối quan hệ mới, giống như bạn muốn.
Tuy nhiên, hãy cẩn thận, vì bạn đang sử dụng mô hình của riêng mình cho việc này, nếu bạn không đặt xác thực cho mình một cách chính xác, bạn có thể có cùng một cặp khóa ngoại rất nhiều lần, bởi vì theo mặc định, bạn chỉ cần kiểm tra xem id phải là duy nhất. .
[CHỈNH SỬA] Sau khi làm rõ một chút, giải pháp ở trên giải quyết được "vấn đề", nhưng thực tế không phải là lý do cho hành vi này.
Cakephp có tính năng
Vì vậy, khi bạn muốn thêm một hàng mới, cake sẽ xóa tất cả các liên kết trước đó và thêm các liên kết mới. Một cách để giải quyết vấn đề này là tìm tất cả Qsets
thuộc về một câu hỏi và thêm chúng vào $data
mảng (với việc bổ sung liên kết câu hỏi mới mà bạn muốn thêm). Liên kết này
đã giúp tôi hiểu các hiệp hội HABTM (tìm kiếm "Thử thách IV").
Tôi biết giải pháp mà tôi đưa ra trước đây đã giúp bạn giải quyết "vấn đề", nhưng giải pháp này được tạo ra với cảm giác rằng bạn có QsetsQuestion
tệp mô hình ở đâu đó. Vì bạn không làm vậy, giải pháp sẽ là lấy tất cả Question
liên kết và thêm chúng dưới dạng một mảng mới. Hoặc thực sự tạo một QsetsQuestion
mô hình và tạo các liên kết như thế này:
Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.
Hoặc thay đổi hành vi của bánh ... Không ai trong số họ có vẻ đẹp, tôi biết.
Vì vậy, tóm tắt cho các giải pháp:
-
Mỗi khi bạn muốn lưu một liên kết Qset-Question mới, hãy truy xuất các liên kết đã lưu trữ trước đó, đặt nó vào mảng cần lưu và lưu chúng
//find previously associated Qsets, lets say it's 1,2,3 and 4 $data = array('Question'=>array('id'=>1), 'Qsets'=>array('Qsets'=>array(1,2,3,4, $new_qset)); $this->Question-save($data);
Lưu ý không có QsetsQuestion
, vì nó không tồn tại. Đây phải là tùy chọn đầu tiên vì mô hình HABTM không phức tạp
HOẶC
-
Tạo
QsetsQuestion
trong thư mục mô hình của bạn và thay đổi các liên kết như được chỉ ra ở trên. Phần lưu trên bộ điều khiển sẽ là$data = array('qset_id'=>1, 'question_id'=>1) $this->Question->QsetsQuestion->save($data); //also works with $this->Qset->QsetsQuestion
Nó đơn giản hơn nhiều (có thể), nhưng bạn phải tạo một tệp mới và nhớ kiểm tra xem không có liên kết tương tự nào trước đó hay không (kiểm tra xem 2-2 tuple tồn tại trước khi chèn nó). Các quy tắc xác thực đơn giản sẽ hoạt động.
HOẶC
- Thay đổi hành vi cakephp cho điều này ... Tôi không thích điều này.