【问题标题】:PHP / Laravel : Retrieve new info of Model after save()PHP / Laravel:在保存()之后检索模型的新信息
【发布时间】:2020-02-17 17:20:37
【问题描述】:

这是我的问题:我在 sqlserver 数据库中有一个表,如下所示:

Product ( 
 id int identity,
 reference varchar(12),
 name varchar(40)
)

在 laravel 网络应用程序的网页中,我得到了一个仅以名称作为字段的表单和一个提交按钮。 在 DB 端,我创建了一个触发器(而不是插入),它根据生成的 id 更新行的引用。 示例:

RGX0000123

其中123是生成的ID,RGX是随机生成的。

流程遵循 Post/Redirect/Get 设计模式。提交后,我想重定向到引用显示在 URL 中而不是 ID 中的页面。

在 laravel 的控制器中,我用 Eloquent 保存我的对象并重定向到下一页:

$product->save();
return redirect()->route('next_page', ['reference' => $product->reference]);

我的问题是我可以在保存后获取 id 而不是引用。我不知道 Eloquent 是如何工作的,但是使用 Hibernate(JAVA) 可以通过 session.flush() 将对象与数据库中的数据同步来解决。

快速而肮脏的修复正在使用

$product= Product::find($product->id);

有没有更简洁的方法来处理这个问题?

【问题讨论】:

    标签: php sql-server laravel eloquent orm


    【解决方案1】:

    尝试刷新对象:

    $product->save();
    $product->refresh(); // <---
    
    return redirect()->route('next_page', ['reference' => $product->reference]);
    

    来自documentation

    刷新模型

    您可以使用freshrefresh 方法刷新模型。这 fresh 方法将从数据库中重新检索模型。这 现有模型实例不会受到影响:

    $flight = App\Flight::where('number', 'FR 900')->first();
    
    $freshFlight = $flight->fresh();
    

    refresh 方法将使用新鲜的水化现有模型 来自数据库的数据。此外,它所有的加载关系 也会刷新:

    $flight = App\Flight::where('number', 'FR 900')->first();
    
    $flight->number = 'FR 456';
    
    $flight->refresh();
    
    $flight->number; // "FR 900"
    

    【讨论】:

    • 完成了这项工作。谢谢
    【解决方案2】:

    你可以使用 refresh() 方法刷新模型中的数据

    $model->刷新();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 2016-08-10
      • 2017-04-16
      • 1970-01-01
      • 2012-11-11
      相关资源
      最近更新 更多