Codestil für Laravel-Migrationen

Hallo, alle miteinander.





In den ersten fünf Jahren meiner Programmierkarriere arbeitete ich an einem internen Projekt, in den nächsten sieben Jahren in verschiedenen Startups mit einem Team von maximal fünf Entwicklern.





Jetzt arbeite ich seit ein paar Monaten an einem Projekt mit mehr als 20 Entwicklern. Die Arbeit wird gleichzeitig in etwa 30 Filialen ausgeführt. Es gibt fünf Umgebungen für die Codeentwicklung (Entwurf, Entwicklung, Testen, Hotfix, Produkt), jede Umgebung hat eine eigene Datenbank (vor der Einführung des Kamits in Stand / Umgebung erfolgt ein Test-Rollout unter Verwendung einer separaten Datenbank, dh wir haben 10 separate Datenbanken für fünf Umgebungen).





Die Entwicklung in mehreren Branchen ist für mich nicht neu, das habe ich immer getan. Die Entdeckung für mich war, dass die Version des Codes und die Version des Datenbankschemas in keiner Weise synchronisiert sind. In einem kleinen Projekt ist es kein Problem, das gesamte Schema zu löschen und vollständig zu rollen. Es dauert einige Minuten. In diesem Projekt dauert das Rollen eines Schemas von Grund auf mit Seeding eine Stunde.





Es gibt ein großes Problem beim Synchronisieren der Codeversion und der Datenbankschemaversion.





Im Folgenden werde ich Ihnen die Regeln erläutern, die ich für mich selbst akzeptiert habe, und ich würde mich freuen, wenn Sie uns Ihre Techniken und Techniken mitteilen, die Ihnen bei der Bewältigung dieser Katastrophe helfen.





Haftungsausschluss

Der unten dargestellte Code ist ein verschleierter Kampfcode. Ich habe ihn nicht getestet. Möglicherweise muss er mit einer Datei geändert werden. Ich teile nur Ideen mit Ihnen.





Beschreibung des Problems

, , , - -. .





, - , , , , , ? , ?





, , . , , , . , .





.





: " "

, . , 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

, , , , , .





Sie können auch einen Standardwert im Code verwenden, aber diese Methode gefällt mir nicht, da es sich um harten Code handelt und die Flexibilität unserer Anwendung dadurch beeinträchtigt wird. Der Anwendungsbetrieb sollte entweder über Umgebungsvariablen, Konfigurationsdateien oder Datenbankeinträge konfiguriert werden.





Fazit

Dieses Regelwerk ist sicherlich nicht absolut. Zunächst wenden wir uns dem Kopf zu und verwenden den gesunden Menschenverstand.





Lassen Sie uns in den Kommentaren diskutieren. Bitte teilen Sie Ihre Erfahrungen.








All Articles