Обновите, если данные существуют, в противном случае вставьте новые данные

Я новичок в Laravel. Я хочу вставить данные из массива в базу данных. Мои данные вставляются в базу данных, но когда данные существуют в базе данных, те же данные загружаются в базу данных. Я хочу вставить только новые данные, которых нет в базе данных.

$str=$this->entry();
$end=$this->exit_entry();

$st=array_chunk($str,5);
$ex=array_chunk($end,5);
$result=array();
foreach($st as $v1){
    $tmp = array(
        'Employee_id'=>$v1[0],
        'Employee_name'=>$v1[1],
        'Date' => $v1[2],
        'Day' =>$v1[3],
        'Time1' => $v1[4]
    );

    foreach($ex as $v2){
        if($v2[1] == $v1[1] && $v2[0] == $v1[0] && $v2[2] == $v1[2] && $v2[3] == $v1[3]  ){
            $tmp['Time2']=$v2[4];
        }
    }
    $result[] =   $tmp;
}

foreach($result as $res) {
    $res1 = EmployeeList::insert($res);
}

//var_dump($res1);

person Alien    schedule 20.09.2015    source источник
comment
какое уникальное поле в вашей базе данных?   -  person Aditya Giri    schedule 20.09.2015
comment
Я имею в виду, это Employee_ID?   -  person Aditya Giri    schedule 20.09.2015
comment
я думаю, что вам поможет функция firstorcreate () вместо insert (), погуглите один раз   -  person ɹɐqʞɐ zoɹǝɟ    schedule 20.09.2015
comment
Каждую дату одно и то же имя сотрудника не будет вставляться дважды   -  person Alien    schedule 20.09.2015
comment
Что ж, может мой ответ может тебе помочь.   -  person Aditya Giri    schedule 20.09.2015


Ответы (2)


Это можно сделать двумя способами, в зависимости от того, что именно вы хотите сделать; используя firstOrCreate() и firstOrNew().

firstOrCreate() проверит все входящие в него значения, и если все они совпадают с записью, уже существующей, тогда он вернет результат, в противном случае он создаст новую запись с параметрами, которые вы передали.

Загвоздка с firstOrCreate заключается в том, что если один из параметров не совпадает, создается новый экземпляр. Например, если вы сделали две вставки только с Employee_name, написанным по-разному, тогда будет создан новый экземпляр, даже если Employee_id не изменился.

Другой вариант - firstOrNew(), который выполняет ту же проверку и, если результаты не найдены, возвращает экземпляр модели, с которым вы можете работать. Однако вам нужно будет сохранить это вручную, вызвав save().

Использование этих:

  • $res1 = EmployeeList::firstOrCreate($res);
  • $res1 = EmployeeList::firstOrNew($res); $res1->save();

Если вы можете просто сделать вставку, не экспериментируя с тем, что вставлено в модель, выберите firstOrCreate(), если вы хотите изменить или вообще выбрать то, что вводится в модель, выберите firstOrNew()

Если вам нужна дополнительная информация о них, то эта публикация хорошо ее суммирует.

person James    schedule 20.09.2015

Я думаю, что ваш вопрос обновлен, если данные уже существуют. Итак, вот что вы можете сделать:

$res1 = EmployeeList::firstOrCreate($res);

Но это работает, только если ваш Employee_id установлен как первичный ключ.

person Aditya Giri    schedule 20.09.2015
comment
Функция firstOrCreate () работает. Сначала я вставил данные формы в базу данных. Затем я вставил эти данные базы данных в новую базу данных, код которой указан в вопросе. Когда я каждый раз отправляю форму, новые данные вводятся после предыдущих данных во вторую базу данных. Если те же данные находятся в базе данных, я хочу только обновить новое значение массива в базе данных - person Alien; 20.09.2015
comment
@Alien, возможно, ваш Employee_id не установлен как index. Пожалуйста, попробуйте установить его как индекс, и у вас должно быть то, что вы хотите сказать. - person Aditya Giri; 20.09.2015
comment
Просто запустите migrate:rollback и попробуйте еще раз - person Aditya Giri; 20.09.2015