Livewire 将集合转化为数组

Дми*_*ков 6 laravel-livewire laravel-8

mount()livewire 组件的功能中,我有一个集合,如下所示:

$this->products = $purchase->getProductsList();
Run Code Online (Sandbox Code Playgroud)

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

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

每当渲染组件的刀片时 - 它工作正常

在此输入图像描述

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

在此输入图像描述

我该如何预防?

PS:如果我投入$this->products使用render()- 它也可以正常工作。

Qir*_*rel 14

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

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

要解决此问题,您可以通过产品模型获取数据,如下所示。由于我还没有看到实际的关系,或者是什么$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();
}
Run Code Online (Sandbox Code Playgroud)