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

2020/11/30 21:22 · php ·  · 0评论

在某些测试中,我已经创建了一个用户模型,并且运行了一些需要保存某些属性的方法。在Rails中,我通常会调用类似这样的东西user.reload来重新填充数据库中的属性。

laravel中有办法吗?我通读了api,找不到用于它的方法:http : //laravel.com/api/4.1/Illuminate/Database/Eloquent/Model.html关于“正确”方法的任何想法吗?

我也看不到 看来您必须:

$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是一个相当大的类。

有一个承诺提交4.0分支在八月作出补充重载()方法,但到目前为止,还没有被合并到新的Laravel分支机构。

但是... Laravel 5提供了一个“ fresh()”方法,该方法将返回当前模型的新实例。使用Laravel 5.0或更高版本后,您可以重新加载模型,如下所示:

$model = $model->fresh(); 

请注意,fresh()不会直接更新现有的$ model,它只会返回一个新实例,因此这就是我们需要使用“ $ model =”的原因。它还接受一个参数,该参数是您希望其加载的关系数组。

如果您尚未使用Laravel 5,但想要相同的功能,则可以将此方法添加到模型中:

public function fresh(array $with = array())
{
    $key = $this->getKeyName();
    return $this->exists ? static::with($with)->where($key, $this->getKey())->first() : null;
}

更新:如果您使用的是Laravel 5.4.24或更高版本,现在有一种$model->refresh()方法可以用来刷新对象的属性和关系,而不是像获取新对象那样fresh()有关更多详细信息,请参见Jeff Puckett答案。

由于PR#19174可用,因为方法5.4.24开始refresh

$model->refresh();

这样,您就不必像该fresh方法的其他答案所示那样处理重新分配,如果您要刷新已传递给另一个方法的模型,这通常没有帮助,因为变量分配将超出该方法的范围。调用上下文以供以后使用。

  • refresh() 是一个可变操作:它将从数据库中重新加载当前模型实例。
  • fresh()是一个不变的操作:它从数据库中返回一个新的模型实例。它不会影响当前实例。
// Database state:
$user=User::create([
  'name' => 'John',
]);

// Model (memory) state:
$user->name = 'Sarah';

$user2 = $user->fresh();
// $user->name => 'Sarah';
// $user2->name => 'John'

$user->refresh();
// $user->name => 'John'

我相信@Antonio的回答是最正确的,但根据不同的使用情况,您还可以使用的组合$model->setRawAttributes$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()是必经之路

本文地址:http://php.askforanswer.com/ruhezailaravelzhongcongshujukuzhongxinjiazai-shuaxinmoxing.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!