【问题标题】:laravel one-to-many on pivot tablelaravel 在数据透视表上一对多
【发布时间】:2018-04-03 21:59:39
【问题描述】:

我有一个四张表,分别是机构、表格、form_institution(pivot table) 和 form_institution_attributes。这是迁移:

机构表:

public function up() {
     Schema::create('institutions', function (Blueprint $table) {
         $table->increments('id');
         $table->string('name', 255);
         $table->softDeletes();
         $table->timestamps();
     });
 }

机构模式:

public function forms() {
    return $this->belongsToMany(Form::class, 'form_institution');
}

表格:

public function up() {
    Schema::create('forms', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name', 255);
        $table->softDeletes();
        $table->timestamps();
    });
}

表格模型:

public function institutions() {
    return $this->belongsToMany(Institution::class, 'form_institution');
}

形成机构数据透视表:

Schema::create('form_institution', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('institution_id')->unsigned();
    $table->integer('form_id')->unsigned();

    $table->foreign('institution_id')->references('id')->on('institutions');
    $table->foreign('form_id')->references('id')->on('forms');
});

到这里为止一切都很好。但是我需要再添加一个表,它是属性表,它是数据透视表(一对多)之间的关系

这是表格:

Schema::create('form_institution_attributes', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('form_institution_id')->unsigned();
            $table->integer('field_name_id')->unsigned();
            $table->integer('input_type_id')->unsigned();
            $table->string('field_caption');
            $table->softDeletes();
            $table->timestamps();

            $table->foreign('form_institution_id')->references('id')->on('form_institution');
        });

现在,当我调用机构表和机构->表单参数时,我想使用数据透视表获取 form_institution_attribute(子表)。但我不能这样做?

如何在数据透视表下添加表格作为一对多关系?

【问题讨论】:

  • 首先,您的上一个迁移文件中有一些错误。您应该引用“form_institution”表,因为“institution_form”表不存在。此外,'institution_form_id' 的命名应该是 form_institution_id'。如果你纠正了这些,人们会更容易帮助你。
  • @OrestisPalampougioukis 我错过了,我编辑为 form_institution。
  • 当您不需要额外的表格时,直接在数据透视表中添加属性。执行以下操作:$this->belongsToMany(Form::class, 'form_institution')->withPivot('field_name_id', 'input_type_id', 'field_caption'); 并最终在迁移文件中定义列。 http://laraveldaily.com/pivot-tables-and-many-to-many-relationships/
  • @StevenSteinrücken 哪个迁移文件?我是否将 field_name_id、input_type_id 和 field_caption 列添加到 form_institution 迁移?
  • @GoMommy 你是对的

标签: php laravel


【解决方案1】:

您应该能够使用HasManyThrough 类型的关系。

但是,我认为最好的解决方案是将这些属性添加到您在“form_institution”表中创建的额外列中,然后通过将 withPivot 方法添加到关系定义中来更轻松地检索它们。

所以看起来像这样:

public function forms() {
    return $this->belongsToMany(Form::class, 'form_institution')
        ->withPivot([
            'field_name_id',
            'field_caption'.
            ...
        ]);
}

public function institutions() {
    return $this->belongsToMany(Institution::class, 'form_institution')
        ->withPivot([
            'field_name_id',
            'field_caption'.
            ...
        ]);
}

【讨论】:

  • 它在一个机构下制作多个枢轴参数。这很好接近吗?我想在一个枢轴下添加许多属性。但是现在,我有很多支点。
  • 首先,我对我的答案进行了编辑,建议您也可以使用 HasManyThrough 关系。但是,老实说,我没有看到将您需要的属性添加到数据透视表的问题。将有一个且唯一的数据透视表,称为“form_institution”,其中将包含机构 ID、表单 ID 以及您将插入到新的“form_institution_attributes”表中的“额外”属性。
  • @OretisPalampougioukis 如果有多个要添加的属性实例怎么办?例如,在 OP 的示例中,您有 2 个要与 form_institution 实例关联的属性,或者您可能有 5 个,或者没有。
猜你喜欢
  • 2014-10-31
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 2014-12-13
相关资源
最近更新 更多