Laravel与复合,非标准外键的关系

Ben*_*son 6 laravel

遗憾的是,我需要从第三方供应商导入数据,并将我们的非标准数据库模式与我的laravel项目一起使用.另外,我需要存储多个"公司",每个公司在我的数据库中都有自己的一组用户.

我正试图找出使用Eloquent来处理这些表之间关系的最佳方法(如果可以的话).所以,例如,我的表结构如下:

 BmPerson
  'id',
  'firmId',
  'personId'

BmCoverage
  'id',
  'firmId',
  'personId',
  'securityId'

BmSecurity
  'id',
  'firmId',
  'securityId'
Run Code Online (Sandbox Code Playgroud)

...例如,我需要通过"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);}
Run Code Online (Sandbox Code Playgroud)

然后我可以检索个人的覆盖列表,但我仍然需要以某种方式将"BmCoverage"与"BmSecurities"联系起来.我想我也可以在BmSecurities类中添加一个范围,但是使用Eloquent会更好.

有没有人想出一个在laravel模型关系中使用复合键的好方法,或者我应该坚持使用作用域方法?

Ada*_*dam 6

这里有一个包似乎非常适合您的情况:

Compoships 提供了基于 Laravel 5 的 Eloquent 中的两个(或更多)列指定关系的能力。使用第三方或预先存在的模式/数据库时,经常需要匹配 Eloquent 关系定义中的多个列。

你可以像这样使用它:

class BmPerson extends Model
{
    use \Awobaz\Compoships\Compoships;

    public function bmCoverages()
    {
        return $this->hasMany('App\BmCoverage', ['firmId', 'personId'], ['firmId', 'personId']);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果每个都BmSecurity属于一个BmCoverage,并且每个都BmCoverage属于一个,那么在数据库中替换BmPerson它可能更容易;并 与.​ 然后就可以一键使用默认关系了。'firmId', 'personId'bmperson_idBmCoverage'firmId', 'securityId'bmcoverage_idBmSecurityhasMany


Fra*_*ost 2

您需要的一切都可以在这里找到https://laravel.com/docs/5.2/eloquent-relationships

您可以轻松定义哪些列应作为引用的键。

例子:

public function bmCoverages() {
    return $this->hasMany('App\BmCoverage', 'firmId', 'id');
}
Run Code Online (Sandbox Code Playgroud)

这可能属于您的应用程序\公司或任何名称。

一般来说, hasMany 关系看起来像这样

return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
Run Code Online (Sandbox Code Playgroud)

如您所见,您可以指定键。

  • 实际上我并不认为这是一个丑陋的解决方案。将两个字段组合为主键是很常见的事情 (2认同)