【问题标题】:2 foreign keys referencing same primary key laraavel2个外键引用相同的主键laravel
【发布时间】:2021-12-13 14:37:28
【问题描述】:

我是 Laravel 的新手,我想学习如何使用引用主键的 2 个外键创建递归关系。

我有表 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');
    });

这是我的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');
    }

这是我的Item model

protected $table = 'items';

public function item_associations(){
        return $this->hasMany(UserType::class);
    }

这是我的 Welcome 控制器:

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

显然,我收到一个错误: SQLSTATE[42000]:语法错误或访问冲突:1066 不是唯一的表/别名:'items'(SQL:select * from item_associations 内部连接 ​​items on item_associations.item_id = items.@987654336 @inner join items on item_associations.item2_id = items.id)

在刀片中我想得到这样的东西:

【问题讨论】:

  • 有什么理由不使用多对多关系吗?
  • 如果 item2_id 等于 item_id 那么它不应该有单独的关系。如果它们是不同的 id,那么您需要使用多对多关系。
  • @Bulent 我希望我的 item2_id 与 item_id 相关,例如,如果客户订购的是 item_it 的食物,那么所选项目可能会附带额外的项目(比如说肉汁),这就是为什么我需要 item2_id
  • @DiegoDieh 我希望我的 item2_id 与 item_id 相关,例如,如果客户订购的是 item_it 的食物,那么所选项目可能会附带额外的项目(比如说肉汁),这就是为什么我需要 item2_id

标签: mysql laravel laravel-blade laravel-controller laravel-models


【解决方案1】:

如果你想添加肉汁以外的其他东西怎么办?

我可以建议你 2 个选项。

首先,不要在单独的列中创建外键,而是通过将 id 转换为数组来将它们保留在列中。这很容易设置,而且方式非常灵活。

其次,我认为这是一种更好的方法,使用适当的雄辩关系,如下所示:

你想要实现的结构是一种多对多关系的形式。

您需要 3 个表:item、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();
});

【讨论】:

    猜你喜欢
    • 2014-12-24
    • 1970-01-01
    • 2011-07-11
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多