1
votes

comment sauvegarder de nombreux enregistrements dans une table Laravel Eloquent (pas de relation)

Je veux pouvoir enregistrer de nombreuses lignes d'affilée dans une table, j'ai lu que cela peut être fait en utilisant la méthode create , mais j'obtiens cette erreur en essayant d'utiliser le méthode

SQLSTATE [HY000]: Erreur générale: 1364 Le champ 'nom' n'a pas de valeur par défaut (SQL: insérer dans person_roles ( updated_at , created_at ) valeurs (2019-01-30 07:46:19, 2019-01-30 07:46:19))

mon code

protected $fillable = ['name'];

J'utilise Laravel v5.7.21

Mis à jour, dans mon PersonRole j'ai ajouté cette ligne p>

    $data = [
        ['name' => 'actor'],
        ['name' => 'translator'],
        ['name' => 'director'],
        ['name' => 'stageDirector'],
        ['name' => 'costume'],
        ['name' => 'musical'],
        ['name' => 'supportDirector'],
        ['name' => 'photographer'],
        ['name' => 'choreographer'],
    ];

    $personRoles = PersonRole::create($data);

pour que l'attribution en masse fonctionne, mais j'obtiens toujours l'erreur.


7 commentaires

Essayez-vous de foreach vos données et de créer avec chaque donnée?


oui, cela fonctionnera avec un foreach, mais je pense qu'il existe un moyen d'utiliser Eloquent pour les créer tous à la fois ... je ne suis pas sûr, c'est pourquoi je veux demander ici.


Avez-vous ajouté "nom" dans la propriété à remplir du modèle?


Vous pouvez l'ajouter comme ceci - protected $ fillable = ['name'];


oui je l'ai fait en fait


Pouvez-vous essayer avec un seul enregistrement, que cela fonctionne ou non? comme data = ['name' => 'dummy'] puis enregistrez-le.


foreach ($ data as $ datas) {PersonRole :: create (['name' => $ datas-> name])}? Quelque chose comme ca? Vous pouvez supprimer le nom de votre tableau $ data, faites-le simplement $ data = ['acteur', 'traducteur', ....] fera l'affaire.


3 Réponses :


1
votes

MISE À JOUR:

dans votre cas

public function createManyRecord(array $records){
    foreach ($records as $record) {
        $this->create($record);
    }
    return $this;
}

ou

$now = Carbon::now()->toDateTimeString();
PersonRole::insert([
    ['name'=>'Foo', 'created_at'=>$now, 'updated_at'=>$now],
    ['name'=>'Bar', 'created_at'=>$now, 'updated_at'=>$now],
    ['name'=>'Baz', 'created_at'=>$now, 'updated_at'=>$now],
    ..................................
]);

ou créer une fonction dans la classe de modèle et l'appeler

foreach($data as $datas){PersonRole::create(['name'=>$datas->name])}


5 commentaires

mais la fonction createMany est quand il y a une relation, comme dans votre démo, il y a une relation entre la publication et les commentaires, mais je n'ai aucune relation, donc je ne pense pas que ce soit la bonne et travailler choisir !?


createMany ne fonctionnera pas s'il n'y a pas de relation, comme dans mon cas


dans votre cas PersonRole :: createMany ($ data);


cela me donne une erreur Appel à la méthode non définie App \ PersonRole :: createMany ()


La seule façon d'utiliser foreach dans les données ou de faire foreach dans les fonctions de modèle



2
votes

Vous devez utiliser la méthode insert () , mais lorsque vous utilisez la méthode d'insertion, vous devez insérer manuellement les colonnes created_at et updated_at < pré> XXX


1 commentaires

Cette solution ajoutera Null aux colonnes created_at et updated_at!



1
votes

Vous devez utiliser insert au lieu de create-

$personRoles = PersonRole::insert($data);


0 commentaires