如何添加额外的列以透视 table 多对多

How to add extra column to pivot table many to many

我有简单的itemstable.

示例:

论文。由竹子和棉花制成(如果 google 不撒谎)。

另外,一本用纸做的书。

故竹棉之纸父亦书之子

我想我可以用两个词来解释我的 table 结构。

现在是我的代码。所有这些代码示例和 table 结构都已尽可能简化。

items

╔════╦═══════════════╦══════╗
║ id ║  name         ║ price║
╠════╬═══════════════╬══════╣
║  1 ║ Book          ║ 500  ║
║  2 ║ Paper         ║  50  ║
║  3 ║ Bamboo        ║  15  ║
║  4 ║ Cotton        ║  7   ║
╚════╩═══════════════╩══════╝

item_item table(多对多)

╔════╦═══════════════╦══════════╗
║ id ║  item_id      ║ parent_id║
╠════╬═══════════════╬══════════╣
║  1 ║     2         ║    1     ║
║  2 ║     3         ║    2     ║
║  3 ║     4         ║    2     ║
╚════╩═══════════════╩══════════╝

型号Item

class Item extends Model
{
    protected $fillable = ["name", "price"];

    public $timestamps = false;

    public function components()
    {
        return $this->belongsToMany('App\Models\Item', "item_item", "parent_id", "item_id");
    }
}

ItemController 创建

 public function store(Request $request)
    {
        $request->validate([
            "name" => "required",
            "price" => "required",
        ]);

        $item = Item::create([
            "name" => $request->name,
            "price" => $request->price,
        ]);

        $item->components()->attach($request->items);


        return redirect()->route("items");
    }

同步更新:

$item->components()->sync($request->components);

还有我的看法

<div class="form-group">
    <label for="item">Choose child items</label>
    @foreach ($items as $item)
        <div class="checkbox">
            <label ><input class="mr-2" name="items[]" type="checkbox" value="{{ $item->id }}"/>{{ $item->name }}</label>
        </div>
    @endforeach
</div>

这工作正常,但问题是如何将列 item_count 添加到数据透视表 table item_item。为了计算需要创建一些东西的数量。

例如 500 篇论文创建一本书

我尝试像 this 视频中那样做,但没有用。

将 table 名称和 class 更改为差异名称 喜欢书籍、作者 那么你可以使用 book_id 和 author_id

class book {
      public function author(){
         return $this->belongsTo(App\Models\Author,'id','author_id');
      }
}

引用Laravel Eloquent: Relationships

示例:

table 结构如下:

items id - integer price - integer

parents id - integer name - string

childs item_id - integer parent_id - integer

型号

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
    public function parent()
    {
        return $this->belongsTo(Child::class, 'id', 'item_id');
    }
}

建议

you can use parnt_id in items table

Schema::create('items', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->integer('parnt_id');
    $table->integer('price');
    $table->timestamps();
});

我假设,您可以创建一个迁移来更新您的枢轴 table 结构。

然后,您可以更改您的

$item->components()->attach($request->items);

$item->components()->attach($request->items, [item_count]);

在文档中

将关系附加到模型时,您还可以传递一组附加数据以插入中间 table:

$user->roles()->attach($roleId, ['expires' => $expires]);

同步为

$item->components()->sync([$request->items, $item_count]);

在文档中

您还可以通过以下 ID 传递额外的中间 table 值:

$user->roles()->sync([1 => ['expires' => true], 2, 3]);