Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

CakePHP:Tạo hàng HABTM mới thay vì cập nhật hàng khác

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 QuestionQset 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để lưu trữ ngày UTC ISO8601 trong cơ sở dữ liệu MySQL?

  2. bọc từ không để các số cũng bọc

  3. In dữ liệu trong ResultSet cùng với tên cột

  4. Làm cách nào để thêm số 0 đứng đầu vào độ dài ký tự khác nhau trong mysql?

  5. Cập nhật hàng với dữ liệu từ một hàng khác trong cùng một bảng