Trait的工作方式很奇怪Laravel ORM


Trait is working oddly Laravel ORM

我有下一个特征:

<?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()方法中,我的$lastvar是Illuminate'Database'Eloquent'Builder的实例。在我的另一个模型中,这种特性很好——我错了什么?

Scope应该返回一个Builder实例,因为它意味着可以链接。换句话说,scope永远不应该执行查询。

现在,在你的情况下,IMHO,你不需要一个特点。仅使用内置范围latest():

protected static function check()
{
    ...
    $last = self::lastest('id')->first();
    ...
}