2016-06-08 71 views
0

我有一個現有的數據庫,我需要使用(不修改)使用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模型而不是數組來重複它們。

回答

1

要回答你的眼前問題(也就是將普通數組轉換爲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

0

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