如何最好地实现一对多关系拉拉维尔



我正在与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_idsize_id的第二个表shirt_size,并将它们与外键链接到你的shirtssizes表。

然后,您将定义两个模型之间的适当关系

尺寸模型

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');
}
}

然后,当您需要存储带有尺码的新衬衫时,这取决于您在请求中发送的内容:

  1. 发送大小数组ids

    然后,您需要使用以下validate验证 ID:

$validatedData = $request->validate([
'sizes.*.size_id' => 'required|integer|exists:sizes,id',
]);
  1. 发送大小数组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);
}

最新更新