2016-05-30 47 views
0

我试图一次插入一个数组,我还想更新(如果存在)。但是我得到这个错误。Laravel 5.2一次插入数组并更新(如果存在)

$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功能:

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

或者该快捷方式 - updateOrCreate()

双方将刚刚更新或插入一个模型。

另外,使用质量分配功能,添加到$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

这是不是只是一次插入一行?是不可能插入整个数组? –

4

您可以使用updateOrCreate()方法,可以说你在$jobs变量有工作清单:

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

这就像告诉Laravel,如果指定的title已经存在的工作,更新它。否则,将新作业保存到数据库。

如果你得到质量分配例外,你必须定义$fillable列为@AlexeyMezenin说。

如果愿意,你可以在你的模型创建一个新的静态方法:

class MyModel extends Model 
{ 
    ... 

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

然后你就可以在你的控制器调用MyModel::bulkInsertOrUpdate($jobs)

+0

@Rifiki是不是一个完整的数组做到这一点? –

+0

据我所知没有这样的方式,除非有DB :: table('mytable') - > insert($ array)'但是因为你需要检查存在它不会工作。 – Rifki

+1

@EdvardÅkerberg如果您希望在不使用控制器方法循环$ jobs的情况下查看我的编辑答案。 – Rifki

相关问题