4

我有一个 Eloquent 模型。每当从数据库中检索到它时,我想检查是否满足条件并设置模型属性(如果是这种情况)。

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

4

3 回答 3

12

您有两个有效的选项:

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

<?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在我的模型中添加了一个事件来将值转换为正确的类型。

于 2014-01-04T11:07:29.290 回答
2

您可以在进出时这样做。似乎您希望将其存储在数据库中,因此您可以使用 mutators。

class Foo extends Eloquent {

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

当 everB设置时,它将检查A并存储1B.

旁注:注意B集合和属性之间

于 2014-01-05T12:01:37.780 回答
1

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

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

self::retrieved(function (self $model){
   //all your code here
});
于 2021-07-09T23:01:15.063 回答