2016-06-08 4 views
0

laravel을 사용하는 프로젝트에서 (수정하지 않고) 사용해야하는 기존 DB가 있습니다.모핑이없는 laravel 관계

테이블에는 Accounts 테이블, Vendor 테이블 및 Contacts 테이블이 있습니다. ContactsAccount 또는 Vendor, belongTo/hasMany 관계에 속할 수 있습니다.

Contacts 테이블은 Owner 컬럼이 그 중 하나 또는 AccountsVendor 테이블의 기본 키에 키. 난 당신이 Contacts 테이블에 contactable_idcontactable_type 열을 추가하고, 거기에서 가야 할 위치, 모핑을 사용하는 laravel 세계에서이 작업을 수행 할 수있는 "권리"방법을 알고있는 것처럼

.

그러나 DB를 수정할 수 없기 때문에 기존 관계를 사용하여 작업해야합니다.

나는이 같은 Contact 클래스에 메서드를 추가하여 hackish의 뭔가 정렬을 수행 할 수 있습니다

public static function account_contacts() 
{ 
    return DB::table('Contacts') 
     ->join('Accounts', 'Contacts.Owner', '=', 'Accounts.ID'); 
} 

그러나 이것은 배열의 배열 대신 Contact 객체를 반환합니다.

모핑을 사용하지 않고 실제 Contact 개체를 다시 가져 오거나 관계를 만들 수있는 방법이 있습니까?

편집 : 내가 필요로하는 것에 명확함이 부족해서 죄송합니다. 모든 배열을 배열 대신 Contact 모델로 사용하여 반복 할 수 있도록 Account :: Contacts 또는 모두 Vendor :: ContactsContacts의 배열로 가져와야합니다.

답변

1

은 (즉각적인 질문에 대답하려면 즉, 일반 배열을 Eloquent 모델로 변환) 할 수 있습니다.

$ids = DB:table('Contacts') 
      ->join('Accounts', 'Contacts.Owner', '=', 'Accounts.ID') 
      ->forPage($pageNumber, $totalPerPage) 
      ->pluck('id'); 

return Contact::findMany($ids); 
+0

@ alejandro-- 완벽 해 보입니다. 그것 paginatible 있습니까? – 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

그러나 두 개의 다른 테이블이 동일한 'id'를 가질 수 있기 때문에 형식이 없으면 '소유자'필드 만 이상하다고 생각합니다. 그래서 당신이'Account' 접촉에 대한 질의를 할 때, 처음에'Vendor'의 접촉을 되 찾을 수 있습니다. – Iamzozo