2017-06-22 12 views
-1

PageモデルはEloquentModelクラスに拡張されています。私はいくつかの追加ロジックが必要なコンストラクタをオーバーライドしようとしています。これは私が現在持っているものです。Laravel Eloquent - モデルのコンストラクタをオーバーライドして属性を変更します

class Page extends Model 
{ 

    public function __construct(array $attributes = []) 
    { 

     parent::__construct($attributes); 
     $this->main_image = null; 
    } 

} 

しかし、これは私がPage::find(1);を呼び出すとき$this->attributesプロパティにmain_imageを保存していないようです。

私はPage::findは最終的にこのようになりますこれは、Model::newFromBuilderを呼び出すためであると信じて:あなたは何かがコンストラクタで設定されていることを意味し、それは最初のインスタンスを作成し、属性を設定します見ることができるように

public function newFromBuilder($attributes = [], $connection = null) 
{ 
    $model = $this->newInstance([], true); 

    $model->setRawAttributes((array) $attributes, true); 

    $model->setConnection($connection ?: $this->getConnectionName()); 

    return $model; 
} 

無視されます。

すべての取得/作成されたモデルインスタンスの属性を変更するために、コンストラクタ(または同様のメソッド)をオーバーライドするための回避策はありますか?明らかに私はnewFromBuildernewInstance__constructなどの方法を無効にすることができますが、これは非常にハッキリで維持不能なようです。

ありがとうございます!

+0

基本的に、新しい要素を作成するたびに1つのパラメータを上書きしたいのですか?そのためのモデルイベント、https://laravel.com/docs/5.4/eloquent#eventsを使用してください。特に、「作成/作成」を参照してください。 – Gacek

+0

オーバーライドは単なる例であり、複数のパラメータがオーバーライドされていて、if文などでラップされている可能性があります。それぞれのモデルに対してObserverクラスを作成せずにすべてのクラスに適用できる場合は、得た。ありがとう! – Giedrius

+0

あなたのモデルに 'main_image'フィールドがない理由はありますか?モデルの内部に設定する最終目標は何ですか?潜在的に、より多くの情報を潜在的に持つ問題への別のアプローチがあるかもしれません。すべてのページが 'main_image'を持っていれば、' $ page-> mainImage-> get() 'を実行できるようになります。 – Mikey

答えて

0

あなたが必要なすべてを取得または設定したときに自動的にLaravel Eloquent's Accesors and Mutatorsを使用し、その後、モデルの属性を変更できるようにしている場合:

定義アンアクセサ

あなたにgetFooAttributeメソッドを作成し、アクセサを定義するにはmodelここで、Fooは、アクセスしたい列の「頑丈な」ケース名です。この例では、first_name属性のアクセサーを定義します。

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class User extends Model 
{ 
    /** 
    * Get the user's first name. 
    * 
    * @param string $value 
    * @return string 
    */ 
    public function getFirstNameAttribute($value) 
    { 
     return ucfirst($value); 
    } 
} 

あなたが見ることができるように、列の元の値は、あなたが操作し、返却することができ、アクセサに渡されます。FIRST_NAME属性の値を取得しようとしたときにアクセサが自動的に雄弁によって呼び出されます値。 、ミューテータを定義して、モデルのFooにsetFooAttributeメソッドを定義するには

$user = App\User::find(1); 

$firstName = $user->first_name; 

の定義Aミューテータ

:アクセサの値にアクセスするには、単にモデルのインスタンス上のfirst_name属性にアクセスすることができます。あなたがアクセスしたい列の "頑丈な"ケース名です。ですから、再度、first_name属性のミューテータを定義しましょう。このミューテータは、自動的に私たちがモデル上のfirst_name属性の値を設定しようとしたときに呼び出されます。

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class User extends Model 
{ 
    /** 
    * Set the user's first name. 
    * 
    * @param string $value 
    * @return void 
    */ 
    public function setFirstNameAttribute($value) 
    { 
     $this->attributes['first_name'] = strtolower($value); 
    } 
} 

あなたが値を操作することができ、属性に設定されている値を受け取りますミューテータと設定しますEloquentモデルの内部$ attributesプロパティの操作値。私たちはサリーにfirst_nameの属性を設定しようとするのであれば、例えば、この例では

$user = App\User::find(1); 

$user->first_name = 'Sally'; 

を、setFirstNameAttribute関数は値サリーと呼ばれます。次に、mutatorはstrtolower関数を名前に適用し、結果の値をinternal $ attributes配列に設定します。

関連する問題