Laravel firstOrNew по указанному c столбцу таблицы - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть массив объектов, поступающих с внешнего интерфейса. Я только хочу создать новую запись того, что поступает, если она еще не присутствует в базе данных, но только с помощью primaryKey ('The_ID').

Когда я использую firstOrNew, он создает дублирующую запись.

Модель:

 protected $primaryKey = 'The_ID'; // Fake name.

 public $incrementing = true;

 public $timestamps = false;

 protected $fillable = [
   // all fields except the $primaryKey
 ];

Контроллер:

 $array = $request->lists;

 foreach ($array as $list) {
   ( new Model )->firstOrNew([
     'sue' => 'young',
     'foo' => 'bar',

     'datetimeadded' => \Carbon::now() // previous dev used this name :(
   ])->save();
 }

Мне бы хотелось, чтобы, если The_ID был в базе данных, не сохранял. The_ID приходит в запросе, поэтому я могу получить к нему доступ с помощью $list['The_ID'] в l oop.

Если на этот вопрос уже был дан ответ, пожалуйста, закройте. Благодаря.

1 Ответ

0 голосов
/ 20 февраля 2020

firstOrNew принимает 2 массива. 1 - это ваше where предложение, а второе - то, что вы хотите вставить. Используя только 1 массив, вы в основном получаете предложение where во всем. Измените ваш код на:

foreach ($array as $list) {
   ( new Model )->firstOrNew(
   ['id' => $request->id],
   [
     'sue' => 'young',
     'foo' => 'bar',

     'datetimeadded' => \Carbon::now() // previous dev used this name :(
   ])->save();
 }

Первый массив, который я использовал в основном, выглядит примерно так:

where('id' ,'=',$request->id);
  • id : PK вашей таблицы,
  • $ request-> id : идентификатор элемента, поступающего из внешнего интерфейса, соответствующего вашему PK.

Вы также можете использовать updateOrCreate для этого поэтому вы обновите текущие поля существующей записи или создадите новую запись.

...