如何添加额外的列以透视 table 多对多
How to add extra column to pivot table many to many
我有简单的items
table.
示例:
论文。由竹子和棉花制成(如果 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]);
我有简单的items
table.
示例:
论文。由竹子和棉花制成(如果 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]);