【问题标题】:Livewire turns collection into arrayLivewire 将集合变成数组
【发布时间】:2021-09-28 15:08:27
【问题描述】:

在livewire组件的mount()函数中我有一个集合,看起来像这样:

$this->products = $purchase->getProductsList();

getProductsList() 是购买模型的函数:

public function getProductsList() : Collection
{
    $products = $this->purchaseSkus->pluck('sku.product')->unique();
    return $products;
}

无论何时渲染组件的刀片 - 它都可以正常工作

但在同一个刀片中,我在组件中有一个带有 wire:model="description" 和函数 updatedDescription() 的文本区域。并且在 textarea 中进行更改后,$products 变成了数组

如何预防?

P.S.:如果我将 $this->products 放入 render() 函数 - 它也可以正常工作。

【问题讨论】:

    标签: laravel-8 laravel-livewire


    【解决方案1】:

    在 Laravel 中有两个不同的集合,一个“默认”集合 Illuminate\Support\Collection - 另一个用于 Eloquent 集合,Illuminate\Database\Eloquent\Collection。您应该使用第二个 - 因为 Livewire 会更好地知道如何使用它来序列化/反序列化 Eloquent 模型集合。

    pluck() 返回一个Illuminate\Support\Collection 的实例——Livewire 将作为一个数组进行水合。任何不是模型或 Eloquent 集合的东西都将作为数组进行水合(除了不可迭代的对象,如字符串、整数、布尔值等)。

    要解决此问题,您可以通过 Product 模型获取数据,类似这样。因为我没有看到实际的关系,或者$this->purchaseSkus 是什么,所以这有点伪代码,您应该将关系sku.purchase 修复为实际的关系。这将获取与$this->purchaseSkus 中的数据相关的所有产品。

    public function getProductsList() : Illuminate\Database\Eloquent\Collection
    {
        return Product::whereHas('sku.purchase', function($query) {
                return $query->whereIn('id', $this->purchaseSkus->puck('id'));
            })
            ->distinct()
            ->get();
    }
    

    【讨论】:

    • 但未来也应该支持正常的集合,因为有时你的数据与任何模型都不相关。有时你只希望你的数据作为一个集合,这样你就可以像对象一样在视图中访问它,这对我来说就是这种情况,但我认为我现在必须使用数组; )
    • 支持普通集合,但如果集合的内容是模型等对象,Livewire 不可能知道如何对其进行再水化。任何其他对象也是如此。使用更新版本的 Livewire,现在有一个 boot() 生命周期方法,这意味着您可以在那里执行一些逻辑来自己补充它。也可以直接挂钩hydrate()方法
    猜你喜欢
    • 2020-08-13
    • 2011-04-02
    • 1970-01-01
    • 2022-11-11
    • 2013-02-19
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    相关资源
    最近更新 更多