遗憾的是,我需要从第三方供应商导入数据,并将我们的非标准数据库模式与我的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模型关系中使用复合键的好方法,或者我应该坚持使用作用域方法?
这里有一个包似乎非常适合您的情况:
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
您需要的一切都可以在这里找到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)
如您所见,您可以指定键。
| 归档时间: |
|
| 查看次数: |
813 次 |
| 最近记录: |