Laravel Livewire 绑定模型 Carbon 属性

Posted

技术标签:

【中文标题】Laravel Livewire 绑定模型 Carbon 属性【英文标题】:Laravel Livewire bind model Carbon attribute 【发布时间】:2021-01-11 19:07:07 【问题描述】:

我正在使用 Laravel Livewire v2,我需要将表单日期输入绑定到后端 Livewire 组件中的模型 Carbon 属性,但到期日期格式似乎是不可能的。

更准确地说:

选择日期时,表单日期输入选择器LiveWire使API调用发送正确的日期(例如:@ 987654323 Livewire 组件正确接收字符串值并将其传递给模型 模型将字符串转换为 Carbon 对象并将其分配给其可填充属性 Livewire 组件尝试将数据发送回客户端,但它没有对 Carbon 对象执行 ->format('Y-m-d') 格式,因此发送了一个序列化的日期对象 当对象未序列化时,前端接收例如2012-12-25T20:30:00.000000+04:00 MSK 日期输入中断

我还发现,在 Livewire v1 中,可以使用键值数组或自定义转换方法转换属性 (link),但在 v2 (link) 中已将其删除;有一个示例使用hydrate/dehydrate 方法来实现相同的效果,但该示例涵盖了组件属性的情况,而不是像我的情况那样的嵌套属性。

有没有办法在将数据发送回客户端时转换模型日期属性或添加格式?

【问题讨论】:

【参考方案1】:

更新(2020-10-15)

自 Livewire v2.3 起,模型转换现在可以在直接绑定到模型属性时工作(又名 wire:model)。

您需要做的就是转到您的模型并提供您的日期转换,让我们以Post 模型为例:

class Post extends Model

    protected $casts = [
        'published_at' => 'date:Y-m-d'
    ];

这将使 Livewire 知道您的 published_at 字段应以 Y-m-d 格式序列化以在客户端使用它,并在其更新时将其转换回 Carbon (DateTime) 实例.

现在,您可以安全地将其附加到您的 <input> 字段:

<input type="date" wire:model="published_at" />

旧答案

目前,有一个待处理的 PR 旨在为 Livewire v2 解决此问题。如果你去支持它会很有帮助:)

https://github.com/livewire/livewire/pull/1665

【讨论】:

以上是关于Laravel Livewire 绑定模型 Carbon 属性的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Livewire:组件还是控制器? [关闭]

laravel livewire 异常:不支持具有多个模型连接的队列集合

如何在 Eloquent 模型中使用 Laravel Livewire?

Laravel Livewire - 选择后选择输入数据丢失

为啥 livewire 数据绑定不起作用?

对 Laravel Livewire 组件进行水合和脱水意味着啥?