在Laravel中扩展模型get / build方法

时间:2014-08-21 09:25:47

标签: php laravel eloquent

我每次从数据库中检索它时都需要更新我的person对象,然后再次保存..但是怎么做?

我的对象Person,其bool属性seen_by_organization在创建时为0。 第一次从数据库中检索Person时,我想将seen_by_organization设置为1。

我已尝试进入构造函数,但似乎无法正常工作

public function __construct(array $attributes = array())
{
    parent::__construct($attributes);

    if($this->seen_by_organization == 0)
    {
        $this->seen_by_organization = 1;
        $this->save();
    }
}

我知道一种方法将代码绑定到“保存时”,但不是“在获取之前”或“在获取之后”。

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

    //This is on saving
    static::saving(function($model)
    {

    });

    //Is there something like this ? 
    static::getting(function($model)
    {

    }
}

我希望你能帮助我

谢谢!

2 个答案:

答案 0 :(得分:2)

此处没有内置事件。此外created不是您需要的 - 当将新模型插入存储时会触发它。

你需要这样的东西:

// This is called after fetching data from db
// override it in order to fire the event you need
public function setRawAttributes(array $attributes, $sync = false)
{
    parent::setRawAttributes($attributes, $sync);

    $this->fireModelEvent('loaded', false);
}

// add handler for new event
public static function loaded($callback)
{
    static::registerModelEvent('loaded', $callback);
}

// do the job
public static function boot()
{
    parent::boot();

    static::loaded(function ($user) {
       if($user->exists && $user->seen_by_organization == 0)
       {
         $user->seen_by_organization = 1;
         $user->save();
       }
    });
}

请注意,将使用get()first()等检索每个模型,因此可能会有多个inserts

答案 1 :(得分:0)

我明白了!

创建活动的名称

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

    static::created(function($model)
    {
        if($model->seen_by_organization == 0)
        {
            $model->seen_by_organization = 1;
            $model->save();
        }
    });
}