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

fkvaft9z  于 2023-01-19  发布在  PHP
关注(0)|答案(6)|浏览(343)

在我的一些测试中,我创建了一个用户模型,运行了一些需要保存某些属性的方法,在rails中,我通常会调用user.reload这样的函数来重新填充数据库中的属性。
在laravel中有没有这样的方法呢?我通读了API,没有找到一个方法:http://laravel.com/api/4.1/Illuminate/Database/Eloquent/Model.html您对“正确”的方法有什么想法吗?

mkshixfv

mkshixfv1#

在8月份,有一个commit提交给了4.0分支,以添加reload()方法,但到目前为止,它还没有与较新的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()那样获取一个新对象。

bt1cpqcv

bt1cpqcv2#

由于5.4.24refresh方法,因此PR#19174可用。

$model->refresh();

这样,您就不必像fresh方法的其他答案中所示的那样处理重新赋值,如果您想刷新一个已经传递到另一个方法中的模型,这通常是没有帮助的,因为变量赋值将超出稍后使用的调用上下文的范围。

2ic8powd

2ic8powd3#

  • 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'
fbcarpbf

fbcarpbf4#

我也看不出来。看来你得:

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

zysjyyx4

zysjyyx45#

我相信@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(),应该采用

wlp8pajw

wlp8pajw6#

在Laravel中,您可以使用refresh方法刷新模型的数据。此方法从数据库中检索模型的最新数据,并用该数据更新模型的属性。例如:

$user = App\User::find(1);
$user->name = 'John Doe';
$user->save();

$user->refresh();

在此示例中,refresh方法用于从数据库中检索ID为1的用户的最新数据,并使用该数据更新$user模型的属性。如果另一个进程已更新数据库中的数据,并且您希望确保模型的数据是最新的,则此方法非常有用。

相关问题