【问题标题】:Laravel how to return virtual generated column on model createLaravel如何在模型创建时返回虚拟生成的列
【发布时间】:2023-03-05 06:17:01
【问题描述】:

我有下表:

| id | number_one | number_two | number |
| 1  | 10         | 20         | 10020  |

其中numbernumber_onenumber_two 的虚拟创建组合。现在,当访问一行时,Laravel 模型也会按预期返回 number

Number::find(1); // returns [ id => 1, number_one => 10, number_two => 20, number => 10020]

但是在使用时

Number::create(['number_one' => 10, 'number_two' => 21]);

它只返回

[number_one => 10, number_two => 21, id => 2]

所以我的问题是如何让它在创建时返回以下内容:

[ number_one => 10, number_two => 21, number => 10021, id => 2]

是的,我可以使用附加查询或getNumberAttribute 方法,但希望避免这种情况

【问题讨论】:

  • 好吧,insert 声明不是 select,所以您可能想要 refresh 模型,所以它会执行 select 并获取所有字段
  • 在创建模型事件时可以修改数字列:laravel.com/docs/8.x/eloquent#events-using-closures
  • @lagbox 这似乎是目前最好的解决方案,因为fresh 可以链接到create
  • 是的 refresh 返回具有更新属性和关系的当前实例,fresh 返回一个新实例,因此无论哪种方式,您都可以从这些方法返回模型:)

标签: laravel eloquent laravel-7


【解决方案1】:

由于create 导致了INSERT 语句,因此不会发生从表中获取字段的SELECT。您会注意到,如果您有一个具有默认值的表并且您没有传递这些字段,那么您的模型中也不会包含它们。

要获取这些字段,您需要执行 SELECT。您可以在 Model 实例上调用 refresh 以从数据库中刷新其属性和关系,或者您也可以调用 fresh 从数据库中获取新实例(基本上是 find)。 [两种方法都会返回一个模型实例]

$model = Model::create([...])->refresh();
// or
$model = Model::create([...])->fresh();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-06
    • 2023-03-05
    • 2019-06-12
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多