我有一个现有的数据库,我需要使用laravel来使用(不修改)项目。
有Accounts
表,Vendor
表和Contacts
表。 Contacts
可以属于Account
/ Vendor
关系中的belongTo
或hasMany
。
Contacts
表格有Owner
列,可以键入Accounts
或Vendor
表的主键。
据我所知,"对"在laravel世界中执行此操作的方法是使用变形,您可以在contactable_id
表中添加contactable_type
和Contacts
列,然后从那里开始。
但是,由于我无法修改数据库,因此我需要一种使用现有关系的方法。
我可以通过向Contact
类添加一个方法来做一些hackish:
public static function account_contacts()
{
return DB::table('Contacts')
->join('Accounts', 'Contacts.Owner', '=', 'Accounts.ID');
}
然而,这将返回一个数组数组而不是Contact
个对象。
有没有办法让实际的Contact
个对象回来,或者在不使用变形的情况下创建关系?
Account
:: Contacts
或所有Vendor
:: Contacts
作为Contacts
的数组,以便我可以使用它们来迭代它们{ {1}}模型,而不是数组。
答案 0 :(得分:1)
要回答您的直接问题(即将普通数组转换为Eloquent模型),您可以这样做:
$ids = DB:table('Contacts')
->join('Accounts', 'Contacts.Owner', '=', 'Accounts.ID')
->forPage($pageNumber, $totalPerPage)
->pluck('id');
return Contact::findMany($ids);
答案 1 :(得分:0)
belongsTo
和hasMany
第二个参数都是外键,您可以更改。您还可以向其添加where
条件 - 如果有必要,您可以保留where
条件,如果没有这样的字段,则可以Contact
条件public function contacts()
{
return $this->hasMany('App\Contact', 'Owner')->where('type', 'accounts');
}
条件1}}只属于一个模型。
如果我正确理解您的问题,您可以为帐户模型设置您的关系示例:
public function contacts()
{
return $this->hasMany('App\Contact', 'Owner')->where('type', 'vendor');
}
对于供应商型号:
git fetch origin our-team