laravel relationship without morphing
我有一个现有的数据库,我需要使用(不修改)使用laravel的项目。laravel relationship without morphing
有一个Accounts
表,Vendor
表和Contacts
表。 Contacts
可以属于Account
或Vendor
,关系为belongTo
/hasMany
。
Contacts
表具有一个Owner
列,该列用于键入Accounts
或Vendor
表的主键。
根据我的理解,在laravel世界中这样做的“正确”方式是使用变形,在表中添加contactable_id
和contactable_type
列,然后从那里开始。
但是,由于我无法修改数据库,我需要一种使用现有关系的方法。
我可以通过添加方法将Contact
类这样做一些排序的hackish:
public static function account_contacts()
{
return DB::table('Contacts')
->join('Accounts', 'Contacts.Owner', '=', 'Accounts.ID');
}
然而,这将返回一个数组的数组代替Contact
对象。
有没有办法让实际的Contact
对象回来,或者在不使用变形的情况下创建关系?
编辑:抱歉,我需要的不清晰。我只想获得全部Account
:: Contacts
或全部Vendor
:: Contacts
作为Contacts
的数组,因此我可以使用它们作为Contact
模型而不是数组来重复它们。
要回答你的眼前问题(也就是将普通数组转换为Eloquent模型),您可以这样做:
$ids = DB:table('Contacts')
->join('Accounts', 'Contacts.Owner', '=', 'Accounts.ID')
->forPage($pageNumber, $totalPerPage)
->pluck('id');
return Contact::findMany($ids);
belongsTo
和hasMany
第二个参数是您可以更改的外键。您还可以为其添加where
条件- 如果有必要,您可以离开where
条件,如果没有这样的字段,并且一个Contact
只属于一个模型。
如果我正确理解你的问题,你可以设置你的关系forexample为账户型号:
public function contacts()
{
return $this->hasMany('App\Contact', 'Owner')->where('type', 'accounts');
}
对于供应商型号:
public function contacts()
{
return $this->hasMany('App\Contact', 'Owner')->where('type', 'vendor');
}
但是,我认为如果没有类型,只是一个'Owner'字段是很奇怪的,因为另外两个表可以有相同的'id's。因此,当您查询“Account”联系人时,您可以首先找到一些Vendor的联系人。 – Iamzozo
@ alejandro--看起来很完美。它是否可以打开?用分页方法更新了 – user101289
@ user101289。 – alepeino