【问题标题】:Trait is working oddly Laravel ORMTrait 奇怪地工作 Laravel ORM
【发布时间】:2016-07-11 12:21:31
【问题描述】:

我有下一个特质:

<?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 的实例。在我的另一个模型中,这个特性运行良好 - 我错了什么?

【问题讨论】:

    标签: php laravel orm eloquent laravel-5.2


    【解决方案1】:

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

    现在,在您的情况下,恕我直言,您不需要为此提供特征。只需使用内置范围latest()

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

    【讨论】:

    • 我想创建类似first() 的东西,所以我使用了 trait。但我不明白为什么在其他模型中这个特性很好用,但在这个模型中却不行。
    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2014-03-11
    • 2014-09-27
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多