Bagaimana cara menetapkan nilai default di Ajaran 2?
php
orm
doctrine-orm
Jiew Meng
sumber
sumber
Jawaban:
Nilai default basis data tidak didukung "portable". Satu-satunya cara untuk menggunakan nilai default basis data adalah melalui
columnDefinition
atribut pemetaan tempat Anda menentukanSQL
snippet (DEFAULT
penyebab inklusif) untuk kolom yang bidangnya dipetakan.Kamu bisa memakai:
Nilai default tingkat PHP lebih disukai karena ini juga tersedia dengan benar pada objek yang baru dibuat dan bertahan (Doctrine tidak akan kembali ke database setelah mempertahankan objek baru untuk mendapatkan nilai default).
sumber
Perhatikan bahwa ini menggunakan SQL
DEFAULT
, yang tidak didukung untuk beberapa bidang sepertiBLOB
danTEXT
.sumber
options
parameter ini juga berguna untukunsigned
nilai. lihat jawabanoptions={"default": 0}
Berhati-hatilah untuk menggunakan "dan tidak ', karena hal itu menyebabkan kesalahan dalam versi doktrin saya.Siapkan konstruktor di entitas Anda dan atur nilai default di sana.
sumber
Menggunakan:
dan tidak:
Misalnya:
sumber
Memperbarui
Satu lagi alasan mengapa membaca dokumentasi untuk Symfony tidak akan pernah ketinggalan zaman . Ada solusi sederhana untuk kasus spesifik saya dan mengatur
field type
opsiempty_data
ke nilai default.Sekali lagi, solusi ini hanya untuk skenario di mana input kosong dalam formulir menetapkan bidang DB ke nol.
Latar Belakang
Tidak ada jawaban sebelumnya yang membantu saya dengan skenario spesifik saya tetapi saya menemukan solusinya.
Saya memiliki bidang formulir yang harus berperilaku sebagai berikut:
Saya kemudian mencoba semua rekomendasi yang diberikan di sini. Biarkan saya daftar mereka:
PENTING
Bidang formulir Symfony mengesampingkan nilai default yang ditetapkan pada kelas Entity. Artinya, skema Anda untuk DB Anda dapat memiliki nilai default yang ditentukan tetapi jika Anda membiarkan bidang yang tidak diperlukan kosong saat mengirimkan formulir Anda, bagian
form->handleRequest()
dalamform->isValid()
metode Anda akan menimpa nilai-nilai default diEntity
kelas Anda dan mengaturnya ke nilai-nilai bidang input. Jika nilai kolom input kosong, makaEntity
properti akan disetel kenull
.http://symfony.com/doc/current/book/forms.html#handling-form-submissions
Solusi Saya
Tetapkan nilai default pada controller Anda setelah
form->handleRequest()
di dalamform->isValid()
metode Anda :Bukan solusi yang indah tetapi berhasil. Saya mungkin bisa membuat
validation group
tetapi mungkin ada orang yang melihat masalah ini sebagai transformasi data daripada validasi data , saya serahkan kepada Anda untuk memutuskan.Override Setter (Tidak Bekerja)
Saya juga mencoba menimpa
Entity
setter dengan cara ini:Ini, meskipun terlihat lebih bersih, itu tidak berhasil . Alasannya adalah bahwa
form->handleRequest()
metode jahat tidak menggunakan metode setter Model untuk memperbarui data (galiform->setData()
lebih detail).sumber
Solusi yang saya gunakan adalah a
LifeCycleCallback
. Masih menunggu untuk melihat apakah ada metode "asli" lagi, misalnya@Column(type="string", default="hello default value")
.sumber
if (!$this->getDtPosted()) { $this->setDtPosted(new \DateTime()); }
Anda dapat melakukannya menggunakan xml juga:
sumber
Inilah cara saya menyelesaikannya untuk diri saya sendiri. Di bawah ini adalah contoh Entitas dengan nilai default untuk MySQL. Namun, ini juga memerlukan pengaturan konstruktor di entitas Anda, dan bagi Anda untuk menetapkan nilai default di sana.
sumber
columnDefinition
berjalan langsung ke tujuan memiliki ORM, yang merupakan abstraksi dari database. Solusi ini akan merusak portabilitas, akan membuat perangkat lunak Anda bergantung pada vendor DB Anda dan juga akan merusak alat-alat Migrasi Doctrine.Bekerja untuk saya di database mysql juga:
sumber
Tak satu pun dari ini bekerja untuk saya. Saya menemukan beberapa dokumentasi di situs doktrin yang mengatakan untuk mengatur nilai secara langsung untuk menetapkan nilai default.
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/faq.html#how-can-i-add-default-values-to-a-column
Ini memasukkan nilai yang saya inginkan.
sumber
Menambahkan ke @romanb jawaban yang brilian.
Ini menambahkan sedikit overhead dalam migrasi, karena Anda jelas tidak dapat membuat bidang tanpa batasan nol dan tanpa nilai default.
Dengan jawaban ini, saya mendorong Anda untuk berpikir mengapa Anda memerlukan nilai default di database? Dan biasanya itu memungkinkan pembuatan objek tanpa kendala nol.
sumber
Jika Anda menggunakan definisi yaml untuk entitas Anda, berikut ini berfungsi untuk saya pada database postgresql:
sumber
$entity->setFieldName()
sebelum memerah? Doktrin tampaknya mendefinisikan nilai default pada nol. Satu-satunya solusi di yaml adalah mendefinisikan nilai default DI kelas entitas yang tampaknya bodoh bagi saya karena sudah didefinisikan dalam yaml ... -_-Saya berjuang dengan masalah yang sama. Saya ingin memiliki nilai default dari database ke entitas (secara otomatis). Coba tebak, saya berhasil :)
sumber
Sementara menetapkan nilai dalam konstruktor akan berhasil, menggunakan peristiwa Siklus Hidup Ajaran mungkin merupakan solusi yang lebih baik.
Dengan memanfaatkan
prePersist
Peristiwa Siklus Hidup, Anda dapat menetapkan nilai default pada entitas Anda hanya pada bertahan awal.sumber
hack
. Jangan pernah mengandalkan peretasan.Hati-hati saat menetapkan nilai default pada definisi properti! Sebaliknya, lakukan di konstruktor, agar bebas masalah. Jika Anda mendefinisikannya pada definisi properti, maka tetap objek ke database, kemudian buat sebagian beban, maka properti tidak dimuat lagi akan memiliki nilai default. Itu berbahaya jika Anda ingin tetap objek lagi.
sumber