请教一类复杂的数据库关联关系如何使用 ORM 表述?
问题
最近在做一款翻译相关的产品,遇到一个问题
已知有以下四个维度(language 可以看作两张表)
- 产品 - product 表
- 领域 - domain 表
- 源语言 - language 表(from)
- 目标语言 - language 表(to)
各个维度之间多对多关联
- 每个
产品
下面有支持的领域
- 每个
产品
的领域
下面有支持的源语言
- 每个
产品
的领域
的源语言
下面有支持的目标语言
如何创建中间表来关联他们的关系?
现有方法
目前的方法是创建了一个中间表,direction(product_domain_from_to),每两张表都通过这个中间表里的两个字段关联
class Product extends Model
{
...
public function domains()
{
return $this->belongsToMany(Domain::class, 'direction', 'product_id', 'domain_id');
}
...
}
class Domain extends Model
{
...
public function froms()
{
return $this->belongsToMany(Language::class, 'direction', 'domain_id', 'from_id');
}
...
}
class Language extends Model
{
...
public function tos()
{
return $this->belongsToMany(Language::class, 'direction', 'from_id', 'to_id');
}
...
}
其中 Product 表正常,但是如果期望获取到某个产品的领域的源语言下面有支持的目标语言
的话就比较麻烦了,必须手动传入 product_id, domain_id
return Language::findOrFail($fromId)
->tos()
->wherePivot('product_id', $productId)
->wherePivot('domain_id', $domainId)
->get()
这样就无法使用with
的方法获取数据了
return Language::with('tos')->findOrFail($fromId)->tos;
想看看大家有没有什么更好的数据库设计方案或者编码逻辑
感觉你的关联梳理是不是有点问题:
如果说必须要这么关联的话,远程关联应该可以解决你的问题
如果是复杂的sql、为啥不用DB facade来进行查询呢?