wake-up-neo.com

Wie kann ein Standardattributwert für ein Laravel/Eloquent-Modell festgelegt werden?

Wenn ich versuche, eine Eigenschaft zu deklarieren, wie folgt:

public $quantity = 9;

... es funktioniert nicht, weil es nicht als "Attribut" betrachtet wird, sondern lediglich als eine Eigenschaft der Modellklasse. Nicht nur das, ich blockiere auch den Zugriff auf das tatsächlich vorhandene und vorhandene Attribut "Quantität".

Was sollte ich dann tun?

42
J. Bruni

Das mache ich jetzt:

protected $defaults = array(
   'quantity' => 9,
);

public function __construct(array $attributes = array())
{
    $this->setRawAttributes($this->defaults, true);
    parent::__construct($attributes);
}

Ich werde dies als PR vorschlagen, so dass wir diesen Konstruktor nicht bei jedem Model deklarieren müssen und einfach anwenden können, indem Sie einfach das $defaults-Array in unseren Models deklarieren ...


UPDATE:

Wie aus cmfolio hervorgeht, ist die eigentliche ANTWORT ziemlich einfach

Überschreiben Sie einfach die $attributes-Eigenschaft! So was:

protected $attributes = array(
   'quantity' => 9,
);

Das Problem wurde hier diskutiert.

49
J. Bruni

Ein Update dazu ...

@ j-bruni hat einen Vorschlag eingereicht, und Laravel 4.0.x unterstützt jetzt die Verwendung folgender Optionen:

protected $attributes = array(
  'subject' => 'A Post'
);

Dadurch wird Ihr Attribut subject beim Konstruieren automatisch auf A Post gesetzt. Sie müssen den benutzerdefinierten Konstruktor nicht verwenden, den er in seiner Antwort erwähnt hat.

Wenn Sie jedoch am Ende den Konstruktor wie er verwenden (was ich tun musste, um Carbon::now() zu verwenden), müssen Sie darauf achten, dass $this->setRawAttributes() das überschreibt, was Sie mit dem $attributes-Array oben eingestellt haben. Zum Beispiel:

protected $attributes = array(
  'subject' => 'A Post'
);

public function __construct(array $attributes = array())
{
    $this->setRawAttributes(array(
      'end_date' => Carbon::now()->addDays(10)
    ), true);
    parent::__construct($attributes);
}

// Values after calling `new ModelName`

$model->subject; // null
$model->end_date; // Carbon date object

// To fix, be sure to `array_merge` previous values
public function __construct(array $attributes = array())
{
    $this->setRawAttributes(array_merge($this->attributes, array(
      'end_date' => Carbon::now()->addDays(10)
    )), true);
    parent::__construct($attributes);
}

Weitere Informationen finden Sie im Github-Thread .

73
cmfolio

Ich weiß, das ist wirklich alt, aber ich hatte gerade dieses Problem und konnte dieses Problem mit dieser Site lösen.

Fügen Sie diesen Code Ihrem Modell hinzu

protected static function boot()
{
   parent::boot();

   static::creating(function ($model) {
        $model->user_id = auth()->id();
    });
}

Update/Haftungsausschluss

Dieser Code funktioniert, überschreibt jedoch das reguläre Eloquent-Modell creating-Ereignis

0
pbgneff