2017-10-15 4 views
1

1つのフィールドが配列として提供されている場合、Laravel/Eloquentは1回の呼び出しで複数のレコードを作成する方法を提供しますか?Laravel Eloquent 1つのフィールドが配列として提供されている場合にのみ複数のレコードを挿入する

たとえば、$ requestには以下のデータが入っていますが、propIdsだけが分解されて配列として提供され、他のすべての値はすべて新しいレコードで同じになります。

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

私はforeachの操作を行うと、アレイを構築し、Model::insert($newArray); を実行しかし、多分Laravelは、唯一のフィールドは配列として提供されている場合のためのソリューションを提供しない可能性があります。ありがとう。今私は、配列を作成し、自動的にはcreated_atとupdated_atのを日付を追加しませんModel::insert($newArray);で複数のレコードを挿入Model::insert($newArray);

を呼び出すためにforeachループを使用していますについては

。データベースのデフォルト値としてタイムスタンプを追加しました。

+0

いいえ、あなたはすべてのフィールド値を提供してきました。挿入する前にマップするだけです。 –

答えて

0

はい、可能です。

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

insert()がちょうど1 DBクエリを作成します:あなたはinsert()を使用して、この形式で新しい配列を作成する必要があります。

0

あなたはcreate機能以下のようなLaravelモデルを上書きすることができます。

モデル

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(); 
    } 
    } 
} 

コントローラ

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

新しいメソッドを定義する方が合理的だと思います。 'createMany'は、既存の' create'メソッドを内部的に活用します。これにより、元の 'create'メソッドは未来に必要なインスタンスに対して手つかずのままになります。 – fubar

+0

@fubarはい、できます... –

関連する問題