【发布时间】:2020-09-08 18:29:27
【问题描述】:
我正在使用 Laravel nova 构建一个管理面板。我有一个 Items 表,它本身有一个 belongsToMany,使用(当然)一个数据透视表。
这本身是有效的,但是当我指定项目 A 与项目 B 相关时,不会存储该关系的倒数,因此导致在项目 B 上找不到。
我需要它,因为关系是对称的,这意味着如果 A 与 B 相关,B 也与 A 相关。
存储和检索关系的最佳方式是什么?
这是我当前定义关系的代码,它以一种方式工作。
class Item extends Model
{
public function related(): BelongsToMany
{
return $this->belongsToMany(Item::class, 'item_related', 'item_id', 'related_id');
}
}
所以:假设我有一个包含项目 A、B 和 C 的表,并且关系在数据透视表中定义为这样
item_id - related_id
A - B
A - C
B - C
所以基本上,当我做 B->related 时,我希望它返回 [A, C]。现在它只会返回C,而C根本没有任何相关项
这里有两种可能的解决方案,一种是也插入逆关系,导致
item_id - related_id
A - B
B - A
A - C
C - A
B - C
C - B
这将产生正确的结果,但是如何自动强制 laravel 也保存倒置关系,并确保正确完成删除等操作?
另一个选项是“合并”两个相关的 belongsToMany 调用。
class Item extends Model
{
public function related(): BelongsToMany
{
// return merged $this->relatedFrom and $this->relatedTo
}
public function relatedFrom(): BelongsToMany
{
return $this->belongsToMany(Item::class, 'item_related', 'related_id', 'item_id');
}
public function relatedTo(): BelongsToMany
{
return $this->belongsToMany(Item::class, 'item_related', 'item_id', 'related_id');
}
}
这也会导致各种问题。
那么这里的好方法是什么?
【问题讨论】:
-
我添加了我目前用来定义关系的代码。与这里无关。
-
我添加了我解决这个问题的方法作为答案,当然欢迎其他方法:)