Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

CakePHP:Membuat baris HABTM baru alih-alih memperbarui yang lain

Oke, inilah yang pikirkan sedang terjadi:

Anda tidak menggunakan sihir relasi HABTM yang sangat berguna. Alih-alih memperlakukan tabel ini sebagai tabel relasi belaka, kue menuju ke model yang ditentukan dan melihat relasi yang telah Anda tetapkan dan primaryKeys dan displayFields, dll.

Tidak apa-apa jika Anda memiliki tabel HABTM yang rumit. Tetapi jika itu masalahnya, array data Anda kacau, karena Anda tidak menambahkan Question dan Qset terpisah. Maksud saya, Anda tidak melakukan

$data = array('Question'=>array('title'=>'new_question'),
              'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);

Melakukan itu, Anda membiarkan kue menyelesaikan asosiasi HABTM untuk Anda, dan struktur data itu akan baik-baik saja. Tetapi Anda memiliki model QsetsQuestion Anda sendiri di folder model Anda. Jadi data yang Anda simpan harus seperti tabel lainnya, seperti itu

$data = array('qset_id'=> $qset_id,
              'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);

Dan itu membuat id baru di tabel qsets_questions, dengan relasi baru, seperti yang Anda inginkan.

Namun, berhati-hatilah, karena Anda menggunakan model Anda sendiri untuk ini, jika Anda tidak menetapkan validasi dengan benar, Anda mungkin sering memiliki pasangan kunci asing yang sama, karena kue default cukup periksa bahwa id harus unik .

[EDIT] Setelah sedikit klarifikasi, solusi di atas memang menyelesaikan "masalah", tetapi sebenarnya bukan alasan untuk perilaku ini.

Cakephp memiliki fitur

Jadi ketika Anda ingin menambahkan baris baru, kue menghapus semua asosiasi sebelumnya dan menambahkan yang baru. Cara untuk mengatasi ini adalah dengan menemukan semua Qsets yang termasuk dalam pertanyaan dan menambahkannya ke $data array (dengan tambahan asosiasi pertanyaan baru yang ingin Anda tambahkan). Tautan ini membantu saya memahami asosiasi HABTM (cari "Tantangan IV").

Saya tahu solusi yang saya berikan sebelumnya membantu Anda dengan "masalah", tetapi itu dibuat di bawah kesan Anda memiliki QsetsQuestion file model di suatu tempat. Karena tidak, solusinya adalah mendapatkan semua Question terkait dan menambahkannya sebagai array baru. Atau sebenarnya membuat QsetsQuestion model, dan buat asosiasi seperti ini:

Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.

Atau mengubah perilaku kue... Tak satu pun dari mereka tampak cantik, saya tahu.

Jadi, ringkasan untuk solusi:

  • Setiap kali Anda ingin menyimpan asosiasi Qset-Question baru, ambil kembali asosiasi yang disimpan sebelumnya, masukkan ke dalam larik untuk disimpan, dan simpan

    //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);
    

Perhatikan tidak ada QsetsQuestion , karena itu tidak ada. Ini harus menjadi pilihan pertama karena model HABTM tidak rumit

ATAU

  • Buat QsetsQuestion di folder model Anda dan ubah asosiasi seperti yang ditunjukkan di atas. Bagian simpan pada pengontrol adalah

    $data = array('qset_id'=>1, 'question_id'=>1)
    $this->Question->QsetsQuestion->save($data);    //also works with $this->Qset->QsetsQuestion
    

Ini jauh lebih sederhana (mungkin), tetapi Anda harus membuat file baru, dan ingat untuk memeriksa bahwa tidak ada asosiasi serupa sebelumnya (periksa apakah ada 2-2 Tuple sebelum memasukkannya). Aturan validasi sederhana akan berfungsi.

ATAU

  • Ubah perilaku cakephp untuk ini... Saya tidak suka yang ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hasil urutan Laravel berdasarkan kolom pada tabel polimorfik

  2. django connect mysql --_mysql_exceptions.OperationalError:(2006, <NULL>)

  3. mysql memasukkan tanggal kosong jika tanggalnya tidak benar

  4. Mysql COUNT(*) di beberapa tabel

  5. cara memilih semua data yang array inputnya ditemukan dan tidak ditemukan di mysql