模型中的自定义功能

时间:2015-07-12 07:00:31

标签: php laravel laravel-5 eloquent

我需要根据月份和年份生成下一个号码。这是正确的方法,还是可以不同的方式完成?

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

1 个答案:

答案 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方法设为静态,这样您就不需要一个对象来获取下一个数字。