Php 如何在Laravel中从数据库重新加载/刷新模型?

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;

在我的一些测试中,我创建了一个用户模型,并运行了一些需要保存某些属性的方法。在rails中,我通常会调用
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();