laravel relationship without morphing

问题描述:

我有一个现有的数据库,我需要使用(不修改)使用laravel的项目。laravel relationship without morphing

有一个Accounts表,Vendor表和Contacts表。 Contacts可以属于AccountVendor,关系为belongTo/hasMany

Contacts表具有一个Owner列,该列用于键入AccountsVendor表的主键。

根据我的理解,在laravel世界中这样做的“正确”方式是使用变形,在表中添加contactable_idcontactable_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); 
+0

@ alejandro--看起来很完美。它是否可以打开?用分页方法更新了 – user101289

+0

@ user101289。 – alepeino

belongsTohasMany第二个参数是您可以更改的外键。您还可以为其添加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'); 
} 
+0

但是,我认为如果没有类型,只是一个'Owner'字段是很奇怪的,因为另外两个表可以有相同的'id's。因此,当您查询“Account”联系人时,您可以首先找到一些Vendor的联系人。 – Iamzozo