[英]2 foreign keys referencing same primary key laraavel
I'm relatively new in Laravel and I would like to learn how to create recursive relation with 2 foreign keys referencing the primary key.我在 Laravel 中相对较新,我想学习如何使用引用主键的 2 个外键创建递归关系。
I have table item_associations
which has 2 FK referenced to the item table
's PK:我有表item_associations
,其中有 2 个 FK 引用了item table
的 PK:
Schema::create('item_associations', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->unsignedInteger('item_id');
$table->foreign('item_id')
->references('id')
->on('items');
$table->unsignedInteger('item2_id');
$table->foreign('item2_id')
->references('id')
->on('items');
});
Here is my ItemAssociation model
:这是我的ItemAssociation model
:
protected $table = 'item_associations';
public function items(){
return $this->belongsTo('App\Models\Item','item_id');
}
public function item2_id(){
return $this->belongsTo('App\Models\Item','item2_id', 'item_id');
}
here is my Item model
:这是我的Item model
:
protected $table = 'items';
public function item_associations(){
return $this->hasMany(UserType::class);
}
here is my Welcome controller:这是我的欢迎控制器:
$item_association = DB::table('item_associations')
->join ('items', 'item_associations.item_id', '=', 'items.id')
->join ('items', 'item_associations.item2_id', '=', 'items.id')
->get();
return view('welcome', [
'item_association' => $item_association,
]);
Apparently, I receive an error: SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'items' (SQL: select * from item_associations
inner join items
on item_associations
. item_id
= items
. id
inner join items
on item_associations
. item2_id
= items
. id
)显然,我收到一个错误:SQLSTATE[42000]: Syntax error or access item_associations
: 1066 Not unique table/alias: 'items' (SQL: select * from item_associations
inner join items
on item_associations
. item_id
= items
. id
inner join items
on item_associations
. item2_id
= items
. id
)
in blade I would like to get something like this:在刀片中,我想得到这样的东西:
What if you want to add another thing besides gravies?如果你想在肉汁之外添加其他东西怎么办?
I can suggest you 2 options.我可以建议你2个选择。
First, instead of creating foreign keys in the separate columns, keep ids in a column by casting them an array.首先,不是在单独的列中创建外键,而是通过将它们转换为数组来将 id 保留在列中。 This is easy to setup and very flexible way.这是易于设置且非常灵活的方式。
Second, which is a better way in my opinion, using proper eloquent relationships like following:其次,在我看来,这是一种更好的方法,使用适当的雄辩关系,如下所示:
The structure you want to achieve is a form of many-to-many relationship.您想要实现的结构是一种多对多关系的形式。
You need 3 tables: items, associations, association_item.您需要 3 个表:items、associations、association_item。
// Models/Item.php
public function associations()
{
return $this->belongsToMany(Association::class);
}
// Models\Association.php
public function items()
{
return $this->belongsToMany(Item::class);
}
public function additions()
{
return $this->hasMany($this, 'parent_id', 'id');
}
// Migrations
Schema::create('items', function (Blueprint $table) {
$table->increments('id');
// some fields
$table->timestamps();
});
Schema::create('associations', function (Blueprint $table) {
$table->increments('id');
// some fields
$table->foreingId('parent_id')->nullable()->costrained('assosiations')
$table->timestamps();
});
Schema::create('association_item', function (Blueprint $table) {
$table->increments('id');
$table->foreignId('item_id');
$table->foreingId('association_id');
$table->timestamps();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.