Pertanyaan Bagaimana cara menggunakan opsi kaskade di Doctrine2 agar entitas terkait secara otomatis bertahan?


Bisakah seseorang menjelaskan ini kepada saya:

$user = new User();

/* why do I have to call Entity Comment while trying to insert into db?  */
$myFirstComment = new Comment();

$user->addComment($myFirstComment);

$em->persist($user);
$em->persist($myFirstComment);
$em->flush();

Mengapa saya harus memanggil Entity Comment ketika mencoba memasukkan ke dalam db?

Saya memiliki kaskade untuk itu.

  1. Apakah ini berarti bahwa jika saya memiliki 50 hubungan dalam Entitas Pengguna dengan yang lain entitas saya harus memanggil setiap hubungan secara manual ketika mencoba memperbarui / menyisipkan / menghapus?
  2. Mengapa riam ada jika saya harus melakukan semuanya secara manual?

Jika saya harus memanggil semua hubungan itu secara manual, itu agak bodoh untuk menggunakan Doktrin sama sekali.

Saya tidak mengerti ini. Bantuan apa pun dihargai.

Ini terhubung dengan ini: doktrin 2, tidak dapat dimasukkan ke basis data ketika relasi hadir


9
2018-05-22 19:43


asal


Jawaban:


Agar Doktrin secara otomatis menangani kegigihan Anda User#comments properti Anda harus mengatur riam ke operasi "persisten".

Opsi kaskade (tetap, hapus, gabung, semua) memberi Anda kemampuan untuk ...

$em->persist($myFirstComment);

... jika Anda mengaturnya dengan benar pada sisi invers dari hubungan dua arah misalnya. Ini juga dapat dihapus secara otomatis User#comments jika Anda menghapus entitas Pengguna dengan cascade "hapus"!

contoh:

/**
 * Bidirectional - One-To-Many (INVERSE SIDE)
 *
 * @OneToMany(targetEntity="Comment", mappedBy="author", cascade={"persist", "remove"})
 */
private $comments;

Baca lebih lanjut tentang pemetaan Asosiasi dan kaskade di Kesetaraan Transitif / Opsi Kaskade bab dari dokumentasi.

Tolong ingat:

Doktrin hanya akan memeriksa sisi kepemilikan asosiasi untuk perubahan.

Perubahan yang dilakukan hanya pada sisi kebalikan dari suatu asosiasi diabaikan. Pastikan untuk memperbarui kedua sisi dari asosiasi dua arah (atau setidaknya sisi kepemilikan, dari sudut pandang Doktrin)

  • Asosiasi OneToMany tidak pernah memiliki sisi kepemilikan.
  • Sisi terbalik harus menggunakan mappedBy atribut deklarasi pemetaan OneToOne, OneToMany, atau ManyToMany. Itu mappedBy atribut berisi nama bidang-asosiasi di sisi yang memiliki
  • Sisi kepemilikan harus menggunakan inversedBy atribut deklarasi pemetaan OneToOne, ManyToOne, atau ManyToMany. Itu inversedBy atribut berisi nama bidang-asosiasi di sisi terbalik.
  • ManyToOne selalu merupakan sisi kepemilikan dari asosiasi dua arah.
  • OneToMany selalu merupakan sisi invers dari asosiasi dua arah.

Selanjutnya:

Anda hanya perlu melakukan panggilan jika Anda membuat entitas root baru (yaitu $user = new User() ) yang belum dikelola oleh doktrin (dan Anda tidak perlu menelepon terus $myFirstComment dalam contoh Anda jika Anda telah mengatur opsi cascade dengan benar).

Jika tidak, Anda hanya perlu memanggil flush jika entitas belum karena alasan tertentu telah terlepas.


19
2018-05-23 07:23