gpt4 book ai didi

php - 在 Laravel 中使用 stock 属性设置多对多关系

转载 作者:行者123 更新时间:2023-11-29 15:58:41 25 4
gpt4 key购买 nike

我正在开发一个电子商务网站,您可以在其中购买一些商品,例如衬衫...我有三个模型 Item、ItemColor 和 ItemSize。我已经建立了多对多关系,商店中的一件商品可以有多种颜色和多种尺寸,但每件商品都有自己的库存,这对我来说事情变得复杂。

如果我创建一个项目,例如一件衬衫 X,我可以在该衬衫上附加不同颜色和尺寸的可用(多对多),一件黑色和尺寸 M 的衬衫将有 3 个库存,但我怎样才能设置为每种类型的衬衫都有库存?我无法清楚地看到这一点......

我应该在哪里放置库存属性?也许在数据透视表中?

这是我的模型和迁移:

//item model
protected $table = 'items';


public function colors()
{
return $this->belongsToMany('App\Models\ItemColor');
}

public function sizes()
{
return $this->belongsToMany('App\Models\ItemSize');
}

//tiemsize model

protected $table = 'item_sizes';


public function items()
{
return $this->belongsToMany('App\Models\Item');
}

//item colors

protected $table = 'item_colors';


public function items()
{
return $this->belongsToMany('App\Models\Item');
}

和迁移


//pivot table
Schema::create('item_size_color', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('item_id')->index();
$table->foreign('item_id')->references('id')->on('items');
$table->unsignedInteger('item_size_id')->index();
$table->foreign('item_size_id')->references('id')->on('item_sizes');
$table->unsignedInteger('item_color_id')->index();
$table->foreign('item_color_id')->references('id')->on('item_sizes');
$table->timestamps();
});

//items table
Schema::create('items', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->timestamps();
});

//items color table
Schema::create('item_colors', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->timestamps();
});

//items size table
Schema::create('item_sizes', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->timestamps();
});

模拟 Controller 方法,如何设置库存?

public function create(Create $request)
{
$item = new Item();
$item->colors->attach($request->input('availableColors'));
$item->sizes->attach($request->input('availableSizes'));
$item->sizes = $request->input('color');
$title = $request('title');
if($request->hasFile('image')){ $item->image = $this->uploadFile($request, 'image'); }
$item->save();

$item->load('sizes');
$item->load('colors');


return response()->json([
'item' => $item,
]);

}

最佳答案

我认为belongsToMany不适合你,你应该添加独立的实体ItemOption并在 Controller 、 View 、请求中使用它。

型号:

class ItemOption extens Model
{
protected $fillable = ['item_id', 'item_color_id', 'item_size_id', 'stock'];

public function color()
{
return $this->belongsTo(ItemColor::class);
}

public function size()
{
return $this->belongsTo(ItemSize::class);
}
}

class Item extens Model
{
public function options()
{
return $this->hasMany(ItemOption::class);
}

public function sizes()
{
return $this->hasManyThrough(ItemSize::class, ItemOption::class);
}

public function colors()
{
return $this->hasManyThrough(ItemColor::class, ItemOption::class);
}
}

Controller :

public function create(Create $request)
{
$item = new Item();
$item->title = $request->input('title');;

if($request->hasFile('image')){
$item->image = $this->uploadFile($request, 'image');
}

$item->save();

foreach($request->input('options') as $option){
$option = $item->options()->firstOrNew([
'item_size_id' = $option['size_id'],
'item_color_id' = $option['color_id']
]);

$option->stock = $option['stock'];
$option->save();
}

$item->load('options');
$item->load('sizes');
$item->load('colors');

//or $item->load(['options.size', 'options.color']);

return response()->json([
'item' => $item,
]);
}

关于php - 在 Laravel 中使用 stock 属性设置多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56327170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com