我正在与Laravel合作进行后端。我想保存一个模型,假设它是我的数据库中的衬衫。一件衬衫可以有许多不同的尺寸,所以我希望能够将这样的衬衫记录保存到我的数据库中:
{
"name": "A good shirt",
"descripton": "this shirt is very good",
"price": "$100",
"sizes": ["XL","L","M","S"] <--------- what I want
}
我的问题是,如何在后端保存实现它?如何将不同尺寸的数组保存到我的模型中,并确保在保存此记录时,它符合可用的衬衫尺寸之一?例如,我想确保一件衬衫的尺码只能从小到超大。
我想创建一个名为 Shirt_Sizes 的新模型,让记录是可用的衬衫尺寸,然后在我的衬衫模型中为此设置一个外键。但是我很难弄清楚如何将许多衬衫尺寸保存到衬衫型号中。
我愿意接受在此之外的其他建议。
谢谢!
您拥有的场景是多对多关系,也就是说,一件衬衫可以有多种尺寸,一种尺寸可以有很多衬衫,因此我建议按照 Laravel 文档.https://laravel.com/docs/7.x/eloquent-relations#many-to-many 指定创建两个表表。
shirt
id - integer
name - string
description - string
price - integer
sizes
id - integer
name - string
sizes_shirts
shirt_id - integer
size_id - integer
您的模型如下所示:
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Shirt extends Model
{
/**
* The sizes that belong to the shirt.
*/
public function sizes()
{
return $this->belongsToMany('AppSize');
}
}
如何保存衬衫的尺码:
$sizes_ids = [1, 2, 3];
$shirt->sizes()->sync($sizes_ids);
如何获取衬衫的尺码:
$sizes_of_shirt = $shirt->sizes;
如果一件衬衫有很多尺寸,并且尺寸可以属于许多衬衫,那么你必须定义多对多关系,你可以为衬衫尺寸创建一个单独的表sizes
,然后创建一个包含shirt_id
和size_id
的第二个表shirt_size
,并将它们与外键链接到你的shirts
和sizes
表。
然后,您将定义两个模型之间的适当关系
尺寸模型
class Size extends Model
{
// Get the shirts for this size.
public function shirts()
{
return $this->belongsToMany(Shirt::class, 'shirt_size', 'size_id', 'shirt_id');
}
}
衬衫型号
class Shirt extends Model
{
// Get the size for the shirt.
public function sizes()
{
return $this->belongsToMany(Size::class, 'shirt_size', 'shirt_id', 'size_id');
}
}
然后,当您需要存储带有尺码的新衬衫时,这取决于您在请求中发送的内容:
发送大小数组
ids
:然后,您需要使用以下
validate
验证 ID:
$validatedData = $request->validate([
'sizes.*.size_id' => 'required|integer|exists:sizes,id',
]);
发送大小数组
names
:然后,您需要使用
validate
验证名称:
$validatedData = $request->validate([
'sizes.*.size_name' => 'required|string|exists:sizes,name',
]);
然后,在创建衬衫记录后,您可以使用attach()
方法保存衬衫的多个尺寸:
foreach ($validatedData['sizes'] as $size){
$shirt->sizes()->attach($size['size_id']);
}
或
foreach ($validatedData['sizes'] as $size){
$size_id = Size::where('size_name',$size['name'])->get('id'));
$shirt->sizes()->attach($size_id);
}