1
votes

Est-il possible de changer l'ordre dans lequel les tables migrent dans Laravel?

J'essaie de migrer mes migrations nouvellement créées. Le problème est que le lot de migrations en attente de migration est dans l'ordre dans lequel j'ai créé les migrations en utilisant

| No   | 2019_01_15_002336_product_categories           |       |
| No   | 2019_01_15_002318_product_types                |       |
| No   | 2019_01_15_001617_product_list                 |       |
| No   | 2019_01_15_002357_product_skus                 |       |
+------+------------------------------------------------+-------+

Et donc, ma migration product_list essaie de définir une clé étrangère sur une table qu'elle n'a pas encore migrée.

+------+------------------------------------------------+-------+
| Ran? | Migration                                      | Batch |
+------+------------------------------------------------+-------+
| Yes  | 2014_10_12_000000_create_users_table           | 1     |
| Yes  | 2014_10_12_100000_create_password_resets_table | 1     |
| Yes  | 2019_01_14_203800_server_mode                  | 2     |
| No   | 2019_01_15_001617_product_list                 |       |
| No   | 2019_01_15_002318_product_types                |       |
| No   | 2019_01_15_002336_product_categories           |       |
| No   | 2019_01_15_002357_product_skus                 |       |
+------+------------------------------------------------+-------+

Quand j'exécute php artisan migrate j'obtiens ces erreurs:

C:\xampp\htdocs\iezonsolutions>php artisan migrate
Migrating: 2019_01_15_001617_product_list

   Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1005 Can't create table `iezonsolutions`.`#sql-1844_16e` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `product_list` add constraint `product_list_product_category_foreign` foreign key (`product_category`) references `product_categories` (`id`))

  at C:\xampp\htdocs\iezonsolutions\vendor\laravel\framework\src\Illuminate\Database\Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table `iezonsolutions`.`#sql-1844_16e` (errno: 150 "Foreign key constraint is incorrectly formed")")
      C:\xampp\htdocs\iezonsolutions\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458

  2   PDOStatement::execute()
      C:\xampp\htdocs\iezonsolutions\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458

  Please use the argument -v to see more details.

Est-il possible de migrer mes tables product_category et product_types avant ma table product_list ? Ensuite, je pourrai définir les clés étrangères sans erreur.

Mon statut de migration ressemble à ceci:

$table->foreign('product_category')->references('id')->on('product_categories');
$table->foreign('product_type')->references('id')->on('product_types')->onDelete('cascade');

Je veux qu'il migre dans l'ordre

php artisan make:migration


0 commentaires

3 Réponses :


6
votes

La chose la plus simple que vous puissiez faire est de classer la date et l'heure sur le nom du fichier, qui seront finalement suivies de laravel pour migrer la base de données séquentiellement.


6 commentaires

C'est donc une question de changement autour des 6 derniers chiffres du nom de fichier? Je n'ai pas besoin d'exécuter de commandes d'effacement du cache, il suffit de mettre à jour les 6 derniers chiffres dans l'ordre chronologique dont je veux migrer du premier au dernier et relancer php artisan migrate ? Merci pour cela


Oui, avec date si possible.


Génial, cela migre désormais correctement. Cependant, il n'a pas réellement résolu l'erreur de clé étrangère. PDOException: :( "SQLSTATE [HY000]: Erreur générale: 1005 Impossible de créer la table iezonsolutions. # sql-1844_178 (errno: 150" La contrainte de clé étrangère est mal formée ")")


Schema :: create ('product_categories', function (Blueprint $ table) {$ table-> increments ('id'); ...}); C'est à quoi ressemblent mes product_categories


Il me semble que vous avez oublié d'ajouter la clé dans le schéma. ajoutez d'abord la clé puis ajoutez la contrainte. par exemple. $ table-> entier ('product_category'); puis ajoutez une ligne de contrainte


par exemple. $ table-> entier ('product_category'); then $ table-> Foreign ('product_category') -> references ('id') -> on ('p‌ roduct_categories');



2
votes

Modifiez les noms des fichiers de migration pour qu'ils aient une date inférieure à celle à laquelle vous souhaitez l'exécuter avant

Laravel change l'ordre de migration

donc changez le nom du fichier par exemple

2019_01_15_00000_product_categories


1 commentaires

Merci pour le lien et l'exemple!



0
votes

Modifiez manuellement les horodatages afin que le fichier que vous souhaitez migrer en premier ait un nom d'horodatage / date plus ancien que les fichiers que vous souhaitez migrer ultérieurement.

Modification de l'ordre de migration


0 commentaires