我的Schedule命令删除了我所有的记录

时间:2018-10-13 11:30:43

标签: sql laravel laravel-5 eloquent scheduled-tasks

我有一个称为offer的表,这是我在控制器中存储的方式:

$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日程:运行

我注意到所有报价都已从我的数据库中删除。 我在11:22运行了命令,甚至删除了原本打算在11:30过期的行。

我可能做错了什么吗?

1 个答案:

答案 0 :(得分:2)

代替:

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();