Laravel与自定义数据透视表的多态关系

时间:2018-08-09 15:06:16

标签: laravel relationship laravel-5.6

我有以下

    Schema::create('bursary_providers', function (Blueprint $table) {
        $table->increments('id')->unsigned()->index();
        $table->string('bursary_provider',64);
        $table->timestamps();
    });

    Schema::create('bursary_provider_contacts', function (Blueprint $table) {
        $table->increments('id')->unsigned()->index();
        $table->integer('bursary_provider_id')->unsigned()->index();
        $table->foreign('bursary_provider_id')->references('id')->on('bursary_providers')->onDelete('cascade');
        $table->integer('contact_id')->unsigned()->index();
        $table->foreign('contact_id')->references('id')->on('contacts')->onDelete('cascade');
        $table->timestamps();
    });

    Schema::create('contacts', function (Blueprint $table) {
        $table->increments('id')->unsigned()->index();
        $table->string('contact_name', 32);
        $table->timestamps();
    });

1)是的,我知道这并不符合存储“类型”的典型约定。我这样做是为了实现参照完整性。

2)我将其存储在名为透视表的自定义表中,因为它对我来说更有意义。 Laravels数据透视表的要求是按字母顺序排列,但由于我希望命名为parent_child

现在,如何设置我的模型?据我了解,这种情况将是一个变体(除了“ bursary_providers”以外,还有其他父母-为避免混淆而省去了)。因此,我将在BursaryProvider模型中使用以下内容:

public function contacts() {
    return $this->morphMany('App\Contact');
}

还有我的联系人模型中的以下内容:

public function bursary_provider () {
    return $this->morphTo();
}

如何更改以上内容,以便使用 bursary_providers.id / contacts.id 和数据透视表 bursary_provider_contacts (与 bursary_provider_id contact_id )?

//编辑 为了清楚起见,除了bursary_providers之外,另一个“父母”(bursary_providers可以有很多联系人; bursary_administrators可以有很多联系人;联系人属于一个):

    Schema::create('bursary_administrators', function (Blueprint $table) {
        $table->increments('id')->unsigned()->index();
        $table->string('bursary_administrator',64);
        $table->timestamps();
    });

    Schema::create('bursary_provider_contacts', function (Blueprint $table) {
        $table->increments('id')->unsigned()->index();
        $table->integer('bursary_administrator_id')->unsigned()->index();
        $table->foreign('bursary_administrator_id')->references('id')->on('bursary_administrators')->onDelete('cascade');
        $table->integer('contact_id')->unsigned()->index();
        $table->foreign('contact_id')->references('id')->on('contacts')->onDelete('cascade');
        $table->timestamps();
    });

1 个答案:

答案 0 :(得分:1)

如果您不想遵循Laravel的命名约定,我强烈建议您不要这样做。主要是因为如果遵循这些约定,它就会起作用;其次,您只是为自己做更多的工作!

因此,您需要做的是将所需的表名作为关系上的第二个参数传递。我不明白您为什么要使用morphMany,应该使用EmiratesToMany

示例

public function contacts() {
    return $this->belongsToMany(App::Contact, 'bursary_provider_contacts');
}

public function bursary_provider () {
    return $this->belongsToMany(Bursary provider::class, 'bursary_provider_contacts');
}

修改

只是关于关系类型的脚注

假设您有一个产品模型,一个订单模型和一个发票模型。

现在产品可以属于订单,也可以属于发票。

这并不能证明多态关系的合理性,这简单意味着您将拥有以下表格:

产品 订单 发票 order_product 发票产品

现在是一个多态示例,Laravel也使用相同的示例,因为它很常见。

假设您有一个帖子模型,视频模型和评论模型。

现在帖子模型可以发表评论

视频模型可能会有评论。

因此,除了构建PostComment和VideoComment模型之外,您还可以简单地构建Comment模型,并通过定义多态关系将两个模型的注释与所需模型相关联地存储。

我不想屈尊,但请认真查看Laravel文档,它们是如此有用。

https://laravel.com/docs/5.6/eloquent-relationships#polymorphic-relations