Laravel 5.2一次插入一个数组并更新(如果存在)

时间:2016-05-30 13:09:38

标签: php laravel laravel-5 eloquent

我正在尝试一次插入一个数组,如果存在,我还想更新。但我得到了这个错误。

$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);

2 个答案:

答案 0 :(得分:5)

您可以使用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)

答案 1 :(得分: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'];