不幸的是,我需要从第三方供应商处导入数据,并在我的laravel项目中使用其非标准数据库架构。此外,我需要在数据库中存储多个“公司”,每个“公司”都有其自己的用户集。
我正在尝试找出使用Eloquent来处理这些表之间的关系的最佳方法(如果可以做到)。因此,例如,我的表结构如下:
BmPerson
'id',
'firmId',
'personId'
BmCoverage
'id',
'firmId',
'personId',
'securityId'
BmSecurity
'id',
'firmId',
'securityId'
...例如,我需要通过“BmCoverage”表将“BmPerson”与许多“BmSecurity”相关联。
但是我需要以某种方式使用组合键,因为我在每个表中存储了多个“公司”(按第三方供应商的数据库模式)。
到目前为止,我使用的一种方法是范围界定,例如:对于我的BmCoverage模型:
public function scopeFromFirm($query,$firmId){
return $query->where('firmId','=',$firmId);//->where('personId','=',$personId);}
public function scopeFromPerson($query,$personId){
return $query->where('personId','=',$personId);//->where('personId','=',$personId);}
然后,我可以检索一个人的承保范围列表,但是我仍然需要以某种方式将“BmCoverage”与“BmSecurities”相关联。我想我也可以在BmSecurities类中添加一个作用域,但是仅使用Eloquent会更好。
有没有人想出一种在laravel模型关系中使用复合键的好方法,还是我应该坚持使用作用域方法?
最佳答案
有一个软件包here似乎很适合您的情况:
您可以这样使用它:
class BmPerson extends Model
{
use \Awobaz\Compoships\Compoships;
public function bmCoverages()
{
return $this->hasMany('App\BmCoverage', ['firmId', 'personId'], ['firmId', 'personId']);
}
}
如果每个
BmSecurity
恰好属于一个BmCoverage
,并且每个BmCoverage
恰好属于一个BmPerson
,则在'firmId', 'personId'
DB中用bmperson_id
替换BmCoverage
可能更容易;和'firmId', 'securityId'
和bmcoverage_id
中的BmSecurity
。然后,您可以通过一个键使用默认的hasMany
关系。关于Laravel与复合,非标准外键的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38298490/