从数据库中检索Eloquent模型时执行代码

时间:2013-09-18 23:15:30

标签: php events laravel eloquent

我有一个雄辩的模型。每当从数据库中检索到它时,我想检查是否满足条件并在这种情况下设置模型属性。

编辑:我最初认为restoring事件是放置相关逻辑的正确位置,但正如Tyler Crompton在下面指出的那样,restoring在软删除记录恢复之前被触发

3 个答案:

答案 0 :(得分:11)

您有两个有效选项:

如果我是你,我会选择第一个选项,这就是我的方式:

<?php namespace \Illuminate\Database\Eloquent;

abstract class LoadingModel extends Model {

    /**
     * Register a loaded model event with the dispatcher.
     *
     * @param  \Closure|string  $callback
     * @return void
     */
    public static function loaded($callback)
    {
        static::registerModelEvent('loaded', $callback);
    }

    /**
     * Get the observable event names.
     *
     * @return array
     */
    public function getObservableEvents()
    {
        return array_merge(parent::getObservableEvents(), array('loaded'));
    }

    /**
     * Create a new model instance that is existing.
     *
     * @param  array  $attributes
     * @return \Illuminate\Database\Eloquent\Model|static
     */
    public function newFromBuilder($attributes = array())
    {
        $instance = parent::newFromBuilder($attributes);

        $instance->fireModelEvent('loaded', false);

        return $instance;
    }

}

请确保LoadingModule中的模型有问题。我已经确认这个工作,因为我找到了一个很好的用例。较旧版本的PHP将MySQL值作为字符串返回。通常,PHP会在数值运算中将它们静默地转换为各自的数字类型。但是,转换为JSON不被视为数字操作。 JSON值表示为字符串。这可能会导致我的API客户端出现问题。所以我在模型中添加了loaded事件,将值转换为正确的类型。

答案 1 :(得分:2)

你可以在前进的路上或外出途中这样做。看起来你想将它存储在数据库中,所以你可以使用mutators。

class Foo extends Eloquent {

    public function setBAttribute($value)
    {
        if ($this->attributes['a'] == $this->attributes['b']) {
            $this->attributes['b'] = 1;
        }
    }    
}

如果设置了B,则会检查A,并将1存储在B中。

旁注:请注意设置和属性

之间的B

答案 2 :(得分:0)

我认为这是您可以使用的最佳选择。

当从数据库中检索现有模型时,将触发检索事件。例如,如果您的应用程序中有一个 User 模型,则必须在 User Model 中定义如下代码。

self::retrieved(function (self $model){
   //all your code here
});