特质是奇怪的Laravel ORM

时间:2016-03-24 00:31:07

标签: php laravel orm eloquent laravel-5.2

我有下一个特点:

<?php

namespace App\Traits;

trait LastElement {
    public function scopeLast($query)
    {
        return $query->orderBy('id', 'desc')
                     ->first();
    }
}

正如您所看到的,Laravel的范围很简单。它的工作方式与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的实例。在我的另一个模型中,这个特性运作良好 - 我有什么不对?

1 个答案:

答案 0 :(得分:0)

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

现在在你的情况下恕我直言,你不需要这个特性。只需使用内置范围latest()

HAVING COUNT(DISTINCT value) > 1