我有一个称为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过期的行。
我可能做错了什么吗?
答案 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();