2016-03-24 2 views
1

У меня есть следующая особенность:Черта работает странно Laravel ОРМ

<?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 вар является экземпляром Illuminate\Database\Eloquent\Builder. В моей другой модели эта черта работает хорошо - что я не так?

ответ

0

Сфера применения должна возвращать экземпляр Builder, поскольку он предназначен для обеспечения цепочки. Другими словами, область применения никогда не должна выполнять запрос.

Теперь в вашем случае имхо вам не нужна черта для этого. Просто используйте встроенную область действия latest():

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

Я хочу создать нечто вроде 'first()', поэтому я использовал черту. Но я не понимаю, почему в других моделях эта черта работает хорошо, но в этой модели нет. – ventaquil

Смежные вопросы