Функция Laravel updateOrCreate не обновляет пользовательскую метку времени - PullRequest
0 голосов
/ 12 января 2019

Я использую функцию updateOrCreate для создания новых строк или обновления существует на основе заданных значений. Но когда я пытаюсь обновить значение, которое определено как метка времени (не по умолчанию «create_at» или «updated_at»), оно не обновляет значение.

Проблема возникает только тогда, когда я использую функцию updateOrCreate, и только когда единственное поле для обновления - это поле метки времени. (В моем случае, 'last_scan'). Например, когда я изменяю «статус» на 0, все значения, обновляемые в базе данных, включают поле «last_scan».

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

$categoryEntity = CategoryEntity::updateOrCreate(
    [
        'store_id'  => $this->store_id,
        'remote_id' => $collection->id
    ],
    [
        'remote_parent_id'  => 0,
        'name'              => $collection->title,
        'status'            => 1,
        'last_scan'         => Carbon::now()
    ]
);

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

$categoryEntity->last_scan = Carbon::now();
$categoryEntity->save();

Мой файл миграции выглядит следующим образом:

Schema::create('categories_entities', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('store_id');
            $table->integer('remote_id');
            $table->integer('remote_parent_id');
            $table->string('name');
            $table->integer('status');
            $table->timestamp('last_scan');
            $table->timestamps();
});

Ответы [ 2 ]

0 голосов
/ 12 января 2019

TL; DR

Атрибут «protected $ fillable» в модели не содержал поля «last_scan».

Больше в глубине

После небольшого поиска я заметил, что метод createOrUpdate использует функцию массового обновления. Атрибут $ fillable должен содержать все поля, которые мы хотели бы предоставить для их массового изменения.

Я снова посмотрел на модель и заметил, что защищенный атрибут $ fillable там содержал все поля, кроме 'last_scan'.

Был:

protected $fillable = ['store_id', 'remote_id', 'remote_parent_id', 'name', 'status'];

Сейчас:

protected $fillable = ['store_id', 'remote_id', 'remote_parent_id', 'name', 'status', 'last_scan'];

0 голосов
/ 12 января 2019

В файле модели CategoryEntity добавьте следующее свойство:

/**
 * The attributes that should be mutated to dates.
 *
 * @var array
 */
protected $dates = [
    'last_scan',
];

У тебя это работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...