В существующей записи пропустить, иначе вставить данные Laravel Eloquent

У меня есть следующая структура таблицы, которую я динамически загружаю из API.

public function up() {
    Schema::create('reports', function(Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->increments('id');
        $table->integer('program_id')->unique();
        $table->date('date');
        .
        .
        .
        $table->timestamps();
    });

на каждый запрос API я возвращаю массив данных и пытаюсь сохранить тему в таблице выше. Если программа_id существует, я бы хотел проигнорировать эти записи и сохранить новую. Я оглядывался, но не нашел лучшего способа проверить конкретное значение в извлеченном массиве.

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '528027827' for key 'reports_program_id_unique

Как я сохраняю свои записи

// $datas are the field datas from API
foreach ($datas as $data) 
{
      $report = \Td\Reports\Reports\Reports::firstOrCreate($data);
}

Как пропустить вставку в существующий идентификатор программы и вставить только новые?


person fefe    schedule 22.09.2014    source источник


Ответы (2)


Вы можете использовать firstOrCreate():

$data = ['program_id' => 528027827, ...];

$report = Report::firstOrCreate($data);
person Antonio Carlos Ribeiro    schedule 22.09.2014
comment
Спасибо попробую еще раз - person fefe; 23.09.2014
comment
Пробовал, но все равно получаю SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '528027827' for key 'reports_program_id_unique - person fefe; 23.09.2014

Проблема, с которой вы столкнулись, заключается в том, что вы указываете program_id как уникальное, а затем отправляете массив с данными, которые имеют тот же program_id

Вам нужно либо удалить ключ unique из базы данных, удалить дубликаты из вашего массива, либо, если program_id является первичным ключом, установить его в модели, установив protected $primaryKey = 'program_id';

person Andrew Willis    schedule 27.10.2017