【问题标题】:Do i need a One-to-Many polymorphic relationship?我需要一对多的多态关系吗?
【发布时间】:2022-01-25 00:18:01
【问题描述】:

我遇到了一个无法解决的问题,这是我的模型:

Cloth.php​

public function selling(): BelongsTo
{
    return $this->belongsTo(Selling::class);
}

Selling.php​

public function clothes(): HasMany
{
    return $this->hasMany(Cloth::class);
}

​现在一切正常,非常基本......但后来出现了这个模型:

附件.php​

public function selling(): BelongsTo
{
    return $this->belongsTo(Selling::class);
}

现在问题来了:我需要(我认为)多态关系,但我不明白如何在这种特定情况下实现它。 我有 2 个起始模型可以变形为 1 个模型,但我发现的每个示例都有 1 个起始模型可以变形为 2 个模型。 我需要多态关系吗? 我真的无法摆脱这个。

谢谢!

【问题讨论】:

  • 在这种情况下参考laravel.com/docs/8.x/… 而不是postsvideos 你有clothesaccessories 而不是comments 你有selling
  • @apokryfos 已经尝试过,但我无法让它工作 tbh
  • 我认为你需要多对多的多态结构。按照这里的文档; laravel.com/docs/8.x/…。不过,如果您无法实现您想要的,请分享您的代码以便我们检查。但是,不能肯定地说,直到我知道你到底想要实现什么。但是,如果您将其视为从 2 开始的模型变成 1,那么反过来也是可能的。
  • @AkmalArzhang 它应该是一对多(?),因为一个销售有更多的产品,而一个产品只属于一个销售
  • @AkmalArzhang 我需要一个关系才能立即获得衣服和配饰

标签: laravel eloquent polymorphism


【解决方案1】:

您基本上是在寻找一对多的多态关系。操作方法如下:

假设您的表格的结构如下所示;

Schema::create('sellings', function (Blueprint $table) {
            $table->id();
            $table->integer('relation_id');
            $table->string('relation_type');
            $table->timestamps();
});

Schema::create('accessories', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('details');
            $table->timestamps();
});

Schema::create('cloths', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('description');
            $table->timestamps();
});

Selling.php

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

布料.php

public function selling(){
     return $this->morphOne(Selling::class, 'relation');
}

附件.php

public function selling(){
     return $this->morphOne(Selling::class, 'relation');
}

然后,您可以使用以下方法查询;

$selling = Selling::findOrFail(1)->relation;

现在,当您 dd($selling) 时,您可以从通讯录中得到您正在寻找的内容;

请记住,relation_type 字段需要与模型完全对应。例如,请参见下面的屏幕截图;

这里发生的情况是,当您创建一个名为 test 的多态函数时,数据库字段需要跟随对应于模型的 test_type 和对应于模型/数据库表的 id 的 test_id。

【讨论】:

  • 是的,我正在尝试类似的方法,但我遇到了另一个问题:当我得到所有衣服 (Cloth::all()) 时,它是否有可能不返回构建器查询?定义多态关系后,我得到:“方法 Illuminate\Database\Eloquent\Collection::clothes 不存在。(查看:/app/resources/views/livewire/clothes/clothes.blade.php)”我不能甚至对结果进行分页,因为它返回一个集合
  • @Musamba 我更新了答案以完整描述该场景。您的问题,请参考:stackoverflow.com/questions/65318616/…
  • 由于销售可能对应于特定产品,无论是布料还是配饰,您需要使用 Selling::All() 或 get() 进行查询,例如在 foreach 循环内的对应视图中在迭代中利用 -> 关系。我希望我已经说得够清楚了。
  • 谢谢,我尝试了这个解决方案,但我确实需要多对多的多态关系。编辑:不,我不需要多对多,因为我需要在每个关系中指定一个模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多