Моя команда расписания удаляет все мои записи - PullRequest
0 голосов
/ 13 октября 2018

У меня есть таблица предложений, и я храню ее в своем контроллере:

$offer = Offer::Create([
    'user_id' => Auth::id(),
    'property_id' => $request->property_id,
    'offer_price' => $request->offer_price,
    'offer_period' => $request->offer_period,
    'offer_message' => $request->offer_message,
    'cash_amount' => $request->cash_amount,
    'buyer_type' => $request->buyer_type,
    'expires_at' => now()->addMinutes($request->offer_period),
]);

Я хочу удалить все предложения, для которых expires_at старше даты updated_at.Я использую метки времени.

Это то, что у меня в ядре:

$schedule->call(function () {

    Offer::where('updated_at', '>', 'expires_at' )->delete();

})->everyMinute();

Когда я выполнил команду:

php artisan schedule: запустить

Я заметил, что все предложения были удалены из моей базы данных.Я выполнил команду в 11:22, и даже строки, срок действия которых должен был истечь в 11:30, были удалены.

Что-то, что я, возможно, сделал неправильно?

1 Ответ

0 голосов
/ 13 октября 2018

Вместо:

Offer::where('updated_at', '>', 'expires_at' )->delete();

вы должны использовать:

Offer::whereColumn('updated_at', '>', 'expires_at' )->delete();

Изначально вы использовали простой where.Laravel не знает, что expires_at здесь - это имя столбца, поэтому где будет что-то вроде этого:

SELECT * FROM offers where updated_at > 'expires_at'

И, используя второй метод, Laravel сгенерирует:

SELECT * FROM offers where updated_at > expires_at

без кавычек (и вот что вам нужно).

Вместо второго метода вы также можете использовать конструкцию DB::raw, например:

Offer::where('updated_at', '>', \DB::raw('expires_at'))->delete();
...