2016-05-30 11 views
0

アレイを一度に挿入しようとしていますが、もし存在すれば更新したいと思います。しかし、私はこのエラーが発生します。このためLaravel 5.2アレイを一度に挿入し、存在する場合は更新します。

$customerPosition = CustomerPosition::firstOrNew(['id' => $id]); 
$customerPosition->fill($jobs)->save(); 

またはショートカット - updateOrCreate()

両方がちょうど更新または一つのモデルを挿入します:

$jobs = array(); 

//Iterate over the extracted links and display their URLs 
foreach ($links as $link){ 

     $data = get_job_info($link); 

     $jobs[] = [ 
      'title' => $data['title'], 
      'full_desc' => $data['desc'], 
      'to_date' => $data['date'], 
      'ad_type' => 'fb' 
     ]; 

    } 
} 

DB::table('customer_position')->insert($jobs); 
+0

なぜ 'FbPosition'モデルから' table() 'メソッドを呼び出すのですか?なぜ 'DB'ファサードを使用しないのですか? – Rifki

+0

@Rifkiは正しいですが、存在するかどうか調べるにはどうすればいいですか? –

答えて

0

あなたがmass assignment機能を使用するには、モデルを作成する必要があります。

はまた、質量割り当て機能を使用$fillable、アレイに保存したいすべてのプロパティを追加するには:

class CustomerPosition extends Model 
{ 
    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = ['title', 'full_desc', 'to_date', 'ad_type']; 
+0

これが存在すれば更新されますか? –

+0

申し訳ありませんが、私はその部分を逃しました。コードを更新しました。既存のモデルを更新したり、新しいモデルを作成したりします。 –

+0

これは一度に1つの行を挿入するだけではありませんか?配列全体を挿入することはできませんか? –

4

あなたはupdateOrCreate()メソッドを使用することができ、あなたが$jobs変数内のジョブのリストを持って言うことができます:

foreach($jobs as $job) { 
    MyModel::updateOrCreate(['title' => $job['title']], $job); 
} 

指定したtitleのジョブが既に存在する場合は、それを更新するようにLaravelに伝えるのと同じです。それ以外の場合は、新しいジョブをデータベースに保存します。

質量割り当て例外が発生した場合は、$fillable列を@AlexeyMezeninと定義しなければならないと言います。そして、あなたはあなたのコントローラでMyModel::bulkInsertOrUpdate($jobs)を呼び出すことができます

class MyModel extends Model 
{ 
    ... 

    public static function bulkInsertOrUpdate(array $jobs) 
    { 
     foreach($jobs as $job) { 
      static::updateOrCreate(['title' => $job['title']], $job); 
     } 
    } 
} 

もしあなたがあなたのモデルに新しい静的メソッドを作成することができますしたいです。

+0

@Rifikiは完全な配列でこれを行う方法ではありませんか? –

+0

私が知る限り、DB :: table( 'mytable') - > insert($ array) 'がなければ、そうした方法はありません。 – Rifki

+1

@EdvardÅkerbergあなたのコントローラメソッドで '$ jobs'をループさせることなくそれをしたいなら、私の編集した答えを見てください。 – Rifki

関連する問題