我有一个雄辩的模型。每当从数据库中检索到它时,我想检查是否满足条件并在这种情况下设置模型属性。
编辑:我最初认为restoring
事件是放置相关逻辑的正确位置,但正如Tyler Crompton在下面指出的那样,restoring
在软删除记录恢复之前被触发
答案 0 :(得分:11)
您有两个有效选项:
\Illuminate\Datebase\Eloquent\Model
子类化以添加此类事件。\Illuminate\Datebase\Eloquent\Model
的副本以添加此项(并可能向Laravel on GitHub发送(未经请求的)拉取请求)。根据{{3}},看起来好像他们不想要它。如果我是你,我会选择第一个选项,这就是我的方式:
<?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
});