2016-11-21 59 views
0

我有這樣的模型,我想在SetFooAttribute中獲得一個屬性。但所有時間$ this-> getAttribute('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,但這是非常危險的:它可能會產生衝突,例如 - 當兩個模型同時創建時。

你可以這樣操作與()創建活動結合起來,通過移除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