Gaya kode untuk migrasi Laravel

Halo semuanya.





Selama lima tahun pertama karir pemrograman saya, saya mengerjakan proyek in-house, selama tujuh tahun berikutnya saya bekerja di berbagai startup, dengan tim yang terdiri dari maksimal lima pengembang.





Sekarang saya telah bekerja selama beberapa bulan pada sebuah proyek dengan 20+ pengembang, pekerjaan dilakukan secara bersamaan di sekitar 30 cabang, ada lima lingkungan untuk pengembangan kode (draf, dev, pengujian, perbaikan terbaru, prod), setiap lingkungan memiliki database-nya sendiri (sebelum meluncurkan kamit ke stand / environment, peluncuran pengujian dilakukan menggunakan database terpisah, yaitu, kami memiliki 10 database terpisah untuk lima lingkungan).





Berkembang di banyak cabang bukanlah hal baru bagi saya, saya selalu melakukannya. Penemuan bagi saya adalah bahwa versi kode dan versi skema database tidak disinkronkan dengan cara apa pun. Dalam proyek kecil, tidak menjadi masalah untuk menghapus seluruh skema dan menggulungnya secara keseluruhan, ini membutuhkan beberapa menit; dalam proyek ini, menggulirkan skema dari awal dengan penyemaian membutuhkan waktu dari satu jam.





Ada masalah besar dengan cara menyinkronkan versi kode dan versi skema database.





Di bawah ini saya akan memberi tahu Anda tentang peraturan yang telah saya terima untuk diri saya sendiri dan saya akan senang jika Anda membagikan teknik dan teknik yang membantu Anda mengatasi bencana ini.





Penolakan

Kode yang disajikan di bawah ini adalah kode pertempuran yang dikaburkan, saya belum men-debugnya, mungkin perlu dimodifikasi dengan file. Saya hanya berbagi ide dengan Anda.





Deskripsi masalah

, , , - -. .





, - , , , , , ? , ?





, , . , , , . , .





.





: " "

, . , migrations, , , .





, .





:





#   
php artisan migrate --path="services/best-team-servise/database/migrations/2021_02_04_240000_alter_data_model_table_add_unique_index.php" --pretend
#  --pretend    SQL      ,  

#    
php artisan migrate:rollback --step=1
#    ,   
      
      



,





php artisan ide-helper:models "Project\Models\DataModel"
      
      



:





php artisan db:seed --class=DataModelSeeder
      
      



? up() down() , , .





, , , .





Builder :





        $conn = (new DataModel())->connection;
        $builder = Schema::connection($conn);
      
      



( ):





        $isExists = $builder->hasColumn(
            'data_model',
            'deleted_at'
        );
      
      



, :





        if (!$isExists) {
            $builder->table(
                'data_model',
                function (Blueprint $table) {
                    $table->softDeletesTz();
                }
            );
        }
      
      



- , - , , , :





        $alias = (new DataModel())->connection;
        $builder = Schema
            ::connection($alias)
            ->getConnection()
            ->getDoctrineSchemaManager();

$existingIndexes = $builder->listTableIndexes('data_model');
      
      



Laravel , :





Blueprint::unique('index_name');
      
      



:





Blueprint::dropUnique('index_name');
      
      



Laravel , , , SQL, Laravel ? , !





SQL, :





DROP TRIGGER IF EXISTS trigger_name
    ON public.data_model;
CREATE TRIGGER trigger_name
    BEFORE INSERT
    ON public.data_model
    FOR EACH ROW
    EXECUTE PROCEDURE public.function_name();
      
      



, :





DROP TRIGGER IF EXISTS trigger_name
    ON public.data_model;
      
      



: " "

, 1000+ . 1000 , .





, 50+ , "" .









, create, alter, , drop.





.





alter_data_model_add_property_column
alter_data_model_alter_property_column_to_text
alter_data_model_alter_property_column_set_default_value
alter_data_model_create_index_on_code_type_columns
alter_data_model_create_unique_index_on_code_column
      
      



, , MVP.





:





#     
php artisan make:migration create_profile_table --create=profile

#     
php artisan make:migration add_confirmed_to_profile --table=profile
      
      



database/migrations , .





: , nullable()

, NOT NULL, , , , .





, .





nullable(), , .





, , - :





            $columns = Schema
            ::connection((new DataModel())->connection)
            ->getConnection()
            ->getDoctrineSchemaManager()
            ->listTableColumns($(new DataModel())->getTable());

            $data = [];
            foreach ($columns as $column) {
                $name = $column->getName();
/* @var array[] $record    */
                $exists = key_exists($name, $record);
                if ($exists) {
                    $data[$name] = $record[$name];
                }
            }

            $isSuccess = DataModel
                ::withTrashed()
                ->updateOrCreate(
                    ['uniqe_index_column' => $data['uniqe_index_column'],],
                    $data
                )->exists;
      
      



: , null

, , , , , .





Atau Anda dapat menggunakan beberapa nilai default dalam kode, tetapi saya tidak suka metode ini, karena ini adalah kode yang sulit, dan ini membunuh fleksibilitas aplikasi kita. Operasi aplikasi harus dikonfigurasi baik melalui variabel lingkungan, atau file konfigurasi, atau catatan database.





Kesimpulan

Seperangkat aturan ini tentu saja tidak mutlak, pertama-tama kita berpaling dan menggunakan akal sehat.





Mari kita bahas di kolom komentar. Silakan bagikan pengalaman Anda.








All Articles