2017-10-15 2 views
1

Laravel/Eloquent permet-il de créer plusieurs enregistrements avec un appel, si un seul champ est fourni en tant que tableau? Par exemple, j'ai reçu $ request avec les données ci-dessous, mais seules les propIds seront éclatées et fournies sous forme de tableau, toutes les autres valeurs seront les mêmes pour tous les nouveaux enregistrements.Laravel Eloquent Insertion Enregistrements multiples uniquement si un champ est fourni sous forme de tableau

{"_token": "kEKmrPzu4nCk35xJAMOgdl0kNdwUZvpECsBl91dH", 
"propIds": "126,129,71,82,77,64,69", 
"rate": "4", 
"cost": "55" 
} 

que je pouvais faire un foreach et construire un tableau, puis exécutez Model::insert($newArray); Mais peut-être Laravel fournit une solution si un seul champ est fourni un tableau. Merci.

Car je suis maintenant juste en utilisant la boucle foreach pour créer une matrice, puis appelez Model::insert($newArray);

Insertion de plusieurs enregistrements avec Model::insert($newArray);ne seront pas ajouter automatiquement created_at et updated_at dates. J'ai ajouté un horodatage comme valeur par défaut dans la base de données.

+0

Non, vous avez à fournir toutes les valeurs de champ. Il suffit de les mapper avant de les insérer. –

Répondre

0

Oui, c'est possible. Vous devez utiliser insert() et de créer un nouveau tableau avec ce format:

Model::insert([ 
    ['prop_id' => 126, 'rate' => 4, 'cost' => 55], 
    ['prop_id' => 129, 'rate' => 4, 'cost' => 55], 
    ['prop_id' => 71, 'rate' => 4, 'cost' => 55], 
]); 

insert() va créer une seule requête DB.

0

Vous pouvez remplacer Laravel modèles create fonction comme ci-dessous:

Modèle

namespace App\Models; 

class YourModel extends BaseModel 
{ 
    protected $fillable = [ 
    "_token", "propId", "rate", "cost" 
    ]; 

    // override 
    public static function create(array $attributes = []) 
    { 
    $propIds = array_explode(',', $attributes['propIds']); 

    foreach ($propIds as $key => $value) {   
     $model = new static([ 
     "_token" => $attributes['_token'], 
     "propId" => $value, 
     "rate" => $attributes['rate'], 
     "cost" => $attributes['cost'] 
     ]); 

     $model->save(); 
    } 
    } 
} 

Contrôleur

YourModel::create([ 
    "_token" => $request->input('_token'), 
    "propIds" => $request->input('propIds'), // "126,129,71,82,77,64,69" 
    "rate" => $request->input('rate'), 
    "cost" => $request->input('cost'), 
]); 
+0

Je pense qu'il serait plus logique de définir une nouvelle méthode, par ex. 'createMany', qui utilise la méthode' create' existante en interne. Cela laisse la méthode originale 'create' intacte pour les instances où elle pourrait être nécessaire dans le futur. – fubar

+0

@fubar Oui, ça peut être ... –