Laravel 关系 belongsToMany 与复合主键

Laravel relationship belongsToMany with composite primary keys

我有 3 个 table,我正在尝试建立 order_products 和 order_products_status_names 之间的关系。我有 transition/pivot table 命名为 order_product_statuses。问题是我的 PK,因为我在 table 订单中有 3 个 Pk,而且我不知道如何将这 3 table 通过关系联系起来。 我的迁移是:

Table 订购产品:

 public function up()
{
    Schema::create('order_products', function (Blueprint $table) {
        $table->integer('order_id')->unsigned();
        $table->integer('product_id')->unsigned();
        $table->integer('ordinal')->unsigned();
        $table->integer('size');

        $table->primary(['order_id', 'product_id', 'ordinal']);
        $table->foreign('order_id')->references('id')->on('orders');
        $table->foreign('product_id')->references('id')->on('products');
    });
}

Table 订单产品状态 - 这是我的 transition/pivot table 在 order_products 和 order_product_status_names

之间
 public function up()
{
    Schema::create('order_product_statuses', function (Blueprint $table) {
        $table->integer('order_id')->unsigned();
        $table->integer('product_id')->unsigned();
        $table->integer('status_id')->unsigned();
        $table->integer('ordinal')->unsigned();
        $table->dateTime('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

        $table->foreign('order_id')->references('id')->on('orders');
        $table->foreign('status_id')->references('id')->on('order_product_status_names');
        $table->primary(['order_id', 'product_id', 'ordinal']);
    });
}

最后一个是订单产品状态名称

public function up()
{
    Schema::create('order_product_status_names', function (Blueprint $table) {
        $table->integer('id')->unsigned();
        $table->string('name');
        $table->string('code');
        $table->dateTime('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

        $table->primary('id');
    });
}

我知道这里有两种方式的关系 blengsToMany,但我不知道或者我可以声明这种关系(从 order_products 到 order_product_status_names 和反向)?

好的,我没有在这上面花很多时间,但这是我会做的。正如@Devon 提到的,我可能会为每个 table 添加 id,因为 Eloquent 并不是真正为复合键设计的。正如我在其中一条评论中提到的,我通常会创建启动和更新脚本,因此语法可能不完全正确:

public function up() {
    Schema::create('order_products', function (Blueprint $table) {
        $table->bigIncrements('id')->unsigned();
        $table->integer('order_id')->unsigned();
        $table->integer('product_id')->unsigned();
        $table->integer('order_product_statuses_id')->unsigned();
        $table->integer('ordinal')->unsigned();
        $table->integer('size');

        $table->primary('id');
        $table->foreign('order_id')->references('id')->on('orders');
        $table->foreign('product_id')->references('id')->on('products');
        $table->foreign('order_product_statuses_id')->references('id')->on('order_product_statuses');
    });
}

public function up() {
    Schema::create('order_product_statuses', function (Blueprint $table) {
        $table->bigIncrements('id')->unsigned();
        $table->integer('product_id')->unsigned();
        $table->integer('status_id')->unsigned();
        $table->integer('ordinal')->unsigned();
        $table->dateTime('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

        $table->primary('id');
        $table->foreign('status_id')->references('id')->on('order_product_status_names');
    });
}

public function up() {
    Schema::create('order_product_status_names', function (Blueprint $table) {
        $table->bigIncrements('id')->unsigned();
        $table->string('name');
        $table->string('code');
        $table->dateTime('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

        $table->primary('id');
    });
}

希望对你有所帮助。