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

sev*_*rin 4 php events laravel eloquent

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

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

Tyl*_*ton 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

  • 选项3:在您的具体模型中覆盖`newFromBuilder`,并在事件处理程序中执行您想要执行的任何操作.相当hackish,但可能足够一次性. (4认同)