2016-03-24 2 views
1

ich als nächstes Merkmal haben:Trait arbeitet seltsam Laravel ORM

<?php 

namespace App\Traits; 

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

Wie Sie es einfach Laravel des Oszilloskops sehen. Es funktioniert wie first(), aber das letzte Element zurückgeben.

Ich habe nächstes Modell:

<?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(); 
       } 
      } 
     } 
    } 
} 

Es ist egal, was dieses Modell zu tun - aber in check() Methode meines $last var ist die Instanz von Illuminate\Database\Eloquent\Builder. In meinem anderen Modell funktioniert dieses Merkmal gut - was mache ich falsch?

Antwort

0

Der Bereich sollte eine Builder-Instanz zurückgeben, da sie kettenfähig sein sollte. Mit anderen Worten, scope sollte die Abfrage niemals ausführen.

Jetzt in Ihrem Fall IMHO brauchen Sie kein Merkmal dafür. Verwenden Sie einfach eingebauten Bereich latest():

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

Ich möchte etwas wie 'first()' erstellen, also habe ich Merkmal verwendet. Aber ich verstehe nicht, warum in anderen Modellen diese Eigenschaft gut funktioniert, aber in diesem Modell nicht. – ventaquil