首页 > 解决方案 > 如何在 laravel 中格式化 $with 数据

问题描述

我有 3 个表,一个 Shirts 表,一个 Size 表,以及一个连接它们的表,称为 Shirt_Sizes。衬衫可以有许多不同的尺码,而尺码可以有许多不同的衬衫。

我试图做到这一点,以便每当调用 Shirt 请求时,响应也会返回大小。我目前通过在我的衬衫模型中使用受保护的 $with 衬衫尺寸来做到这一点:

protected $with = ['sizes:size'];

截至目前,我的回复如下所示:

{
    "id": 1,
    "item_name": "A good Shirt",
    "item_description": "Description"
    "item_cost": "150.00",
    "item_sizes": [
        {
            "size": "SM"
        },
        {
            "size": "LG"
        }
    ]
}

我希望它看起来像这样:

{
    "id": 1,
    "item_name": "A good Shirt",
    "item_description": "Description"
    "item_cost": "150.00",
    "item_sizes": ["SM", "LG"]
}

我怎样才能做到这一点?

- -编辑 - -

有关更多上下文,这里是我的衬衫模型目前的样子

class Shirt extends Model
{
    protected $fillable = ['item_name', 'item_description', 'item_cost'];

    protected $with = ['sizes'];

    public function sizes() {
        return $this->belongsToMany(Size::class, 'shirt_sizes', 'shirt_id', 'size_id')->select('size');
    }
}

我尝试在我的尺寸函数中使用 pluck 但这似乎不起作用

public function sizes() {
            return $this->belongsToMany(Size::class, 'shirt_sizes', 'shirt_id', 'size_id')->select('size')->pluck('size');
        }

标签: laraveleloquentmodelrelationshipbackend

解决方案


Collection 方法pluck完全符合您的描述。它检索数组中特定键的所有值。

您可以item_sizes像这样在您的财产上使用它:

Shirt::with('sizes')->first()->item_sizes->pluck('size');

对于您的用例,我建议使用Eloquent resources。它们的目的是为 API 响应转换任何数据集。

use Illuminate\Http\Resources\Json\JsonResource;

class Shirt extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'item_name' => $this->item_name,
            'item_description' => $this->item_description,
            'item_cost' => $this->item_cost,
            'item_sizes' => $this->sizes->pluck('size'),
        ];
    }
}

像这样在你的控制器中使用它:

$shirts = Shirt::with('sizes')->get();

return ShirtResource::collection($shirts);

这将完全按照您的描述返回您的集合,但不会修改模型本身。


推荐阅读