Установка отношения многих ко многим в laravel с атрибутом stock - PullRequest
0 голосов
/ 27 мая 2019

Я работаю в сети электронной коммерции, где вы можете купить некоторые вещи, скажем, рубашки ... У меня есть три модели Item, ItemColor и ItemSize. Я установил отношения «многие ко многим», когда товар в магазине может иметь много цветов и размеров, но каждый из этих предметов будет иметь свой запас, вот где мне все сложно.

Если я создаю предмет, например рубашку Х, я могу прикрепить к этой рубашке различные цвета и размеры (от многих ко многим), рубашка черного цвета и размера М будет в наличии на складе, но как я могу это сделать? настроить так, что у каждого типа рубашки есть запас ?? Я не вижу этого ясно ...

Куда мне положить аттрибут? может быть в сводной таблице?

Вот мои модели и миграции:

//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();
        });

Метод макета контроллера, как мне установить запас?

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,
        ]);

    }

1 Ответ

0 голосов
/ 27 мая 2019

Я думаю, чтоirtToMany не подходит для вас, и вы должны добавить независимую сущность ItemOption и работать с ней в контроллере, просмотре, запросах.

Модели:

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

Контроллер:

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,
    ]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...