2016-11-21 10 views
0

私はSetFooAttribute内に属性を取得するようなモデルを持っています。すべての時間はthis-> getAttribute( 'id')は空です! IDにアクセスする方法はありますか?LaravelはsetAttribute内のモデルIDを取得します

class MyModel extends Model 
{ 

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

     static::created(function($model) 
     { 
      $model->uuid = Uuid::generate(4)->string; 
      $model->save(); 
     }); 
    } 

    public function setFooAttribute($value) 
     { 
      $this->attributes['foo'] = $value.'-'.$this->getAttribute('id'); 
     } 
+0

どのようなコンテキストで '$ model-> foo = 'somevalue''を使用していますか?モデルを作成する前にこれを使用すると、IDはまだ設定されていません。 –

+0

はいモデルを作成する前に使用します。 – RednBlack

答えて

1

あなたは、モデルの主キーの値を取得するにはgetKey()メソッドを使用する必要があります。それを使用してください$this->getKey()

+0

はい、getKey()は機能しますが、モデルを更新して挿入していないときにのみ機能します。私はまだ挿入のIDを取得するためのソリューションが必要です。 – RednBlack

+1

実際に挿入を行うまでは、IDはわかりません。 IDに基づいて属性を設定する場合は、最初に挿入してからフィールド – phobia82

+0

を更新する必要があります。私の質問に関して、あなたの答えはより近似しているので、私はそれを受け入れたものにします。しかし、私はあなたのコードを@JanWillemコードと組み合わせて解決します。 – RednBlack

2

それは本当に問題です。主キーは通常インクリメントされます。つまり、 'insert'クエリを実行するときに、データベース自体がそれを設定します。したがって、モデルを作成する前には使用できません。

事前に次のIDを計算することはできますが、これは非常に危険です。たとえば、2つのモデルが同時に作成された場合、競合が発生する可能性があります。

あなたはsetFooAttribute除去方法、および作成したイベント内のコードの行を挿入することで、作成した()イベントに、この操作を組み合わせることができ:

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

    static::created(function($model) 
    { 
     $model->uuid = Uuid::generate(4)->string; 
     $model->foo = $model->foo . '-' . $model->id; 
     $model->save(); 
    }); 
} 

これは、元に-idを追加しますfoo属性。

ちょっと不思議なことに、なぜIDを列に追加したいですか?

+0

私はいくつかのプロセスでステータスが動的に変更されるモデルを持っています。 (有料、未払い、出荷など..)私はそれぞれのステータスの変更のログを作成します。 – RednBlack

+0

私は@ phobia82溶液と組み合わせてあなたの溶液を使用しました。ありがとうございました。 – RednBlack

関連する問題