我需要根据月份和年份生成下一个号码。这是正确的方法,还是可以不同的方式完成?
class Foo extends Model
{
public function getNextNumber()
{
$result = DB::select('SELECT COALESCE(MAX(number), 0) + 1 AS number FROM foo AS t2 WHERE MONTH(generated_at) = MONTH(CURDATE()) AND YEAR(generated_at) = YEAR(CURDATE())');
return head($result)->number;
}
}
创建新记录时:
$foo = new Foo();
$foo->template = 'template1';
$foo->number = $foo->getNextNumber();
$foo->generated_at = DB::raw('NOW()');
$foo->save();
答案 0 :(得分:1)
只要您的表中没有太多记录,查询本身就可以了 - 否则我会遵循Joel的建议并将当前年份和月份的当前数字存储在单独的表格中喜欢 数字(年,月,数字)。
如果你提供的Laravel代码是你想要为你创建的每个模型运行的,那么我建议使用Eloquent模型事件:
//Foo.php
protected static function boot() {
parent::boot();
static::creating(function($foo) {
$foo->number = $foo->getNextNumber();
$foo->generated_at = DB::raw('NOW()');
});
}
您还可以将getNextNumber方法设为静态,这样您就不需要一个对象来获取下一个数字。