我有下一个特征:
<?php
namespace App'Traits;
trait LastElement {
public function scopeLast($query)
{
return $query->orderBy('id', 'desc')
->first();
}
}
正如你所看到的,这是简单的拉拉威尔的范围。它的工作方式与first()
类似,但返回最后一个元素。
我有下一个型号:
<?php
namespace App;
use App'Traits'LastElement;
use Illuminate'Database'Eloquent'Model;
use Illuminate'Database'Eloquent'SoftDeletes;
class Daemon extends Model
{
use LastElement;
use SoftDeletes;
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected static function check()
{
$last = self::last();
if (!empty($last)) {
sleep(1);
return empty(self::where('id', $last->id)
->where('updated_at', $last->updated_at)
->first());
}
return true;
}
public static function start()
{
if (self::check()) {
$me = new self;
$me->save();
$i = 0;
while (true) {
$i++;
usleep(1 / 3 * 1000);
if (($i % 3) == 0) {
$i = 0;
$me->save();
}
}
}
}
}
这个模型做什么并不重要,但在check()
方法中,我的$last
var是Illuminate'Database'Eloquent'Builder
的实例。在我的另一个模型中,这种特性很好——我错了什么?
Scope应该返回一个Builder实例,因为它意味着可以链接。换句话说,scope永远不应该执行查询。
现在,在你的情况下,IMHO,你不需要一个特点。仅使用内置范围latest()
:
protected static function check()
{
...
$last = self::lastest('id')->first();
...
}