Symfony 5 - Penapis schema_doctrine tidak berfungsi dengan betul
P粉002023326
2023-08-26 18:16:28
<p>Apabila saya melaksanakan baris arahan <code>doctrine:schema:update --force</code> dalam projek saya, saya cuba mengabaikan dua entiti seperti ini: </p>
<pre class="brush:php;toolbar:false;">/*** @ORMEntity(readOnly=true)
* @ORMTable(name="view_tableau_de_bord")*/
kelas ViewTableauDeBord
{
//...
}</pre>
<p>Dalam fail konfigurasi doktrin.yaml saya: </p>
<pre class="brush:php;toolbar:false;">doktrin:
dbal:
default_connection: lalai
sambungan:
lalai:
url: '%env(resolve:DATABASE_URL)%'
pemandu: 'pdo_pgsql'
versi pelayan: '12'
charset:utf8
schema_filter: ~^(?!view_)~
# ...</pre>
<p>Doktrin terus menjana semua entiti dan pandangan saya adalah dalam <kod>penapis_schema</kod>. Apakah penjelasan anda untuk ini? Ini adalah kali pertama saya menggunakan pilihan ini dalam projek. </p>
<p>Tetapan projek:</p>
<ul>
<li>Symfony 5.4.14</li>
<li>PHP 7.4.26</li>
<li>Doktrin: orm: 2.13.3</li>
<li>Teori/Nota: 1.13.3</li>
<li>pakej doktrin/doktrin: 2.7.0</li>
<li>pakej pemindahan doktrin/doktrin: 3.2.2</li>
<li>symfony/doctrine-bridge:5.4.14</li>
<li>Teori/Peranti Data: 1.5.3</li>
</ul></p>
Entiti yang ditandakan dengan bendera
readOnly=true
tidak dijejaki untuk kemas kini lagi tetapi masih boleh untuk memasukkan atau memadam baris, seperti yang dijelaskan dalam dokumentasi.Arahan
doctrine:schema:update
masih akan mengambil kira jadual untuk mengemas kini skema.Dalam jawapan kepada soalan "Abaikan entiti Doctrine2 apabila menjalankan kemas kini pengurus skema" terdapat 3 pilihan yang sah untuk mengabaikan entiti dalam kemas kini skema.
penapis_skema
schema_filter
bukan dibuat untuk "menapis" entiti tetapi untuk menapis jadual db daripada kesedaran doktrin.Ini contohnya:
Dengan mengandaikan anda mencipta jadual secara manual yang dikemas kini daripada cronjob php mentah tersuai yang dipanggil
view_booking_by_customer_per_year
, jadual ini tidak digunakan oleh kod anda dalam projek anda tetapi digunakan untuk analisis data.Ini adalah contoh biasa, anda tidak mahu menjana pertanyaan sedemikian setiap kali anda mengemas kini skema.
Jadi menggunakan
schema_filter
anda boleh memberitahu doktrin untuk mengabaikan jadual ini dalam proses pengesahan dan kemas kininya.Cuba buat jadual rawak menggunakan sql mentah dan gunakan
doctrine:schema:validate
. Ia akan menunjukkandatabase is not in sync
ralat. Sebaik sahaja saya memasukkannya ke dalam schema_filter ralat tidak lagi berlaku.Ia berfungsi untuk
doctrine:migration:diff
anddoctrine:schema:update
schema_ignore_class
Walau bagaimanapun, jika anda ingin mengelak daripada menjana entiti dalam pangkalan data, anda boleh menemuinya daripada pautan dalam jawapan Ernesto:
Hanya berfungsi dari versi Doktrin 2.7. Anda boleh mendapatkan contoh penuh di sini: Abaikan entiti Doctrine2 apabila menjalankan kemas kini Pengurus Skema
Gunakan Migrasi Doktrin
Saya sangat menasihati anda untuk menggunakan
doctrine:migration:diff
thendoctrine:migration:migrate
instead ofdoctrine:schema:update
untuk melakukan perubahan pada pangkalan data Tidak mengapa untuk pembangun tempatan, tetapi apabila dalam pengeluaran ia adalah amalan yang sangat buruk.https://symfony.com/bundles/DoctrineMigrationsBundle/current/index.html