我有一个 Eloquent 模型。每当从数据库中检索到它时,我想检查是否满足条件并设置模型属性(如果是这种情况)。
编辑:我最初认为该restoring
事件是放置相关逻辑的正确位置,但正如 Tyler Crompton 在下面指出的那样,restoring
在恢复软删除记录之前被触发。
您有两个有效的选项:
\Illuminate\Datebase\Eloquent\Model
以添加此类事件。\Illuminate\Datebase\Eloquent\Model
发送(未经请求的)拉取请求)。根据Issue 1685,看起来好像他们不想要它。如果我是你,我会选择第一个选项,这就是我的做法:
<?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
在我的模型中添加了一个事件来将值转换为正确的类型。
您可以在进出时这样做。似乎您希望将其存储在数据库中,因此您可以使用 mutators。
class Foo extends Eloquent {
public function setBAttribute($value)
{
if ($this->attributes['a'] == $this->attributes['b']) {
$this->attributes['b'] = 1;
}
}
}
当 everB
设置时,它将检查A
并存储1
在B
.
旁注:注意B
集合和属性之间
我认为这是您可以使用的最佳选择。
从数据库中检索现有模型时,将触发检索事件。例如,如果您的应用程序中有用户模型,则必须在用户模型中定义如下代码。
self::retrieved(function (self $model){
//all your code here
});