Php 如何在Laravel中从数据库重新加载/刷新模型?
在我的一些测试中,我创建了一个用户模型,并运行了一些需要保存某些属性的方法。在rails中,我通常会调用Php 如何在Laravel中从数据库重新加载/刷新模型?,php,laravel,unit-testing,laravel-4,eloquent,Php,Laravel,Unit Testing,Laravel 4,Eloquent,在我的一些测试中,我创建了一个用户模型,并运行了一些需要保存某些属性的方法。在rails中,我通常会调用user.reload这样的函数,从数据库中重新填充属性 拉维尔有没有办法做到这一点?我通读了api,找不到一个方法:关于“正确”的方法有什么想法吗?我也看不到。看来你必须: $model = $model->find($model->id); 您也可以自己创建一个: public function reload() { $instance = new static;
user.reload
这样的函数,从数据库中重新填充属性
拉维尔有没有办法做到这一点?我通读了api,找不到一个方法:关于“正确”的方法有什么想法吗?我也看不到。看来你必须:
$model = $model->find($model->id);
您也可以自己创建一个:
public function reload()
{
$instance = new static;
$instance = $instance->newQuery()->find($this->{$this->primaryKey});
$this->attributes = $instance->attributes;
$this->original = $instance->original;
}
刚刚在这里测试过,它看起来很有效,但不确定它能发挥多大的作用,Eloquen是一个相当大的类。我相信@Antonio的答案是最正确的,但根据用例的不同,您也可以使用
$model->setrawtattributes
和$model->getAttributes
的组合
$users = User::all();
foreach($users as $user)
{
$rawAttributes = $user->getAttributes();
// manipulate user as required
// ..
// Once done, return attribute state
$user->setRawAttributes($rawAttributes);
}
这样做的主要缺点是,您只是“重新加载”数据属性,而不是更改的任何关系等。这也可能被认为是有利的一面
编辑
从L5开始-fresh()
是一个不错的选择在8月份提交给4.0分支以添加reload()方法,但到目前为止,它还没有与较新的Laravel分支合并
但是。。。Laravel5提供了一个“fresh()”方法,该方法将返回当前模型的新实例。使用Laravel 5.0或更新版本后,可以重新加载如下模型:
$model = $model->fresh();
请注意,fresh()不会直接更新现有的$model,它只返回一个新实例,因此我们需要使用“$model=”。它还接受一个参数,该参数是您希望它加载的关系数组
如果您尚未使用Laravel 5,但希望使用相同的功能,可以将此方法添加到模型中:
更新:如果您使用的是Laravel 5.4.24或更新版本,现在有了一个$model->refresh()
方法,您可以使用该方法刷新对象的属性和关系,而不是像fresh()
那样获取新对象。请参阅Jeff Puckett answer了解更多详细信息。多亏了available,因为它是刷新
方法
$model->refresh();
通过这种方式,您不必像使用fresh
方法的其他答案中所示处理重新分配,如果您想刷新已传递到另一个方法的模型,这通常是没有帮助的,因为变量分配将超出调用上下文稍后使用的范围。
是一个可变操作:它将从数据库重新加载当前模型实例refresh()
是一个不可变的操作:它从数据库返回一个新的模型实例。它不会影响当前实例fresh()
//数据库状态:
$user=user::创建([
“name”=>“John”,
]);
//模型(内存)状态:
$user->name='Sarah';
$user2=$user->fresh();
//$user->name=>'Sarah';
//$user2->name=>“John”
$user->refresh();
//$user->name=>“John”
也许getDirty()方法可以帮助您。这可能值得用laravel-5标签为此创建一个新问题。这在使用模型事件时也非常有用<当refresh
工作时,code>fresh对我不起作用。我用的是拉威尔5号。7@YevgeniyAfanasyev-fresh()
返回一个新的模型实例,因此您必须调用$model=$model->fresh()
,而refresh()
将模型重新加载到位。Laravel文档链接已断开。@Christolytras感谢您的帮助。看起来他们删除了不受支持版本的旧文档。看看当前的版本,它并没有真正的帮助,所以我没有尝试在未来的版本中维护它,而是完全删除了链接-1:“只是在这里测试了它,它看起来很有效,但不确定它能走多远”-这通常是正确的关键。另外,$model->refresh()代码>现在可用。
$model->refresh();