2016-11-21 57 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