0
votes

Laravel Insérer la graine si les données n'existent pas déjà

Y a-t-il un moyen d'exécuter une graine pour insérer uniquement les enregistrements si elles n'existent pas déjà?

Mon que mon semoir Laravel actuel ressemble à ceci xxx < / Pre>

joli standard!

devrais-je devoir envelopper chaque insertion dans une prise d'essai? Comme ceci xxx

plus tard, je souhaiterais peut-être ajouter des lignes supplémentaires au même semoir sans avoir à écrire un nouveau, et que vous exécutez PHP Artisan DB: graine < / Code> Pour ajouter seulement mes nouvelles lignes.

est-ce possible?


0 commentaires

5 Réponses :


2
votes

L'ensemencement n'est censé être utilisé que pour les tests, de toute façon.

Pourquoi n'exécutez-vous pas PHP Artisan Migrate: Fresh -Seed ?

Cela rafraîchra votre base de données (supprime les tables) puis exécute à nouveau toutes vos migrations et redevient enfin la base de données.

Vous ne devriez jamais utiliser des semoirs dans la production.

Ajoutez simplement les nouvelles données à votre semence, exécutez Migrer: frais et re-graine :)


3 commentaires

J'utilise des semoirs pour ajouter des données par défaut dans le système, de sorte que lorsque je le pousse pour la première fois à la production, je n'ai pas à vous soucier de l'ajout de charges de données manuellement. De plus, si j'appuie jamais une nouvelle fonctionnalité contenant de nouvelles migrations avec des données par défaut, je ne peux pas exécuter PHP Artisan dB: graine sur la base de données en direct, car il jette des erreurs que les données par défaut existent déjà!


Vous feriez des semoirs séparés dans ce cas et appelez PHP Artisan DB: GRAINE --Class = USERPLASEDER SO selon le DOCS


Remarque, les développeurs Laravel découragent l'ensemencement en production en vous obligeant à utiliser le drapeau -force.



1
votes

Vous pouvez atteindre cet objectif en utilisant Eloquant UpdateOrinSert () Méthode: XXX

En savoir plus sur IT ici .


1 commentaires

Je pensais à faire cette méthode, mais si l'utilisateur change de mot de passe ou de leurs données sur la ligne, ne le mettez pas à jour sur les données dans la semence?



3
votes

comme Stokoe0990 indiquée, il n'est pas conseillé d'exécuter des semoirs en production. Le semis de Laravel a été écrit comme moyen de générer des données de test. Par the Documentation " Laravel inclut une méthode simple d'ensemencement de votre base de données avec test Données utilisant des classes de semences em> ".

Cela dit, la seule façon de satisfaire votre question est de construire la logique dans votre graine: P>

$users = array(
    ['member_id' => 11111111,'firstname' => 'Joe','lastname' => 'Bloggs'], 
    ['member_id' => 22222222,'firstname' => 'Jim','lastname' => 'Bloggs']
);

foreach ($users as $user) {
  if (\App\User::find($user['id'])) {
    DB::table('users')->insert($user);
  }
}


3 commentaires

Je pense que vous avez raison, cela semble être la voie la plus logique malheureusement!


Je voudrais juste réintérer que les semis de course à la production sont fortement conseillés.


J'aimerais souligner que parfois une application pourrait être nécessaire pour être déployée dans un nouvel environnement pour chaque client et, dans ce cas, vous voudrez peut-être avoir un point de départ avec certaines données. J'ai souvent intégré Sememer dans la migration initiale pour une table pour remplir certaines données en production (premier déploiement uniquement). Juste quelque chose à penser. ;)



2
votes

Vous pouvez y parvenir par Eloquant FirstorCreate .

La méthode FirstOrcreate tentera de localiser un enregistrement de base de données en utilisant les paires de colonne / valeur données. Si le modèle ne peut pas être trouvé dans La base de données, un enregistrement sera inséré avec les attributs de la premier paramètre, ainsi que ceux du deuxième paramètre facultatif.

Donc, si vous identifiez l'utilisateur par membre_id, vous pouvez faire quelque chose comme ceci: xxx

Si vous souhaitez localiser l'enregistrement par 'Member_id' , champs 'FirstName' et "Nom", quelque chose comme ceci: xxx


0 commentaires

0
votes

Le meilleur que je recommande est de tronquer (ou de supprimer toutes) les données de la table à tout moment que vous migrez. Essayez quelque chose comme ceci:

//data in the table
DB::table('users')->delete(); //or use model like this: User::truncate();

DB::table('users')->insert([
                //Global Admin
                [
                    'member_id' => 11111111,
                    'firstname' => 'Joe',
                    'lastname' => 'Bloggs'
                ], 
                [
                    'member_id' => 22222222,
                    'firstname' => 'Jim',
                    'lastname' => 'Bloggs'
                ], 
            ]);


0 commentaires