2017-08-28 55 views
0

它是关于“库”和“用户”的,但它可以被看作是更通用的情况。获取模型的所有关系:混合hasMany和belongsToMany

  • 我有一个Library模型与libraries表关联。
  • libraries表有creator_id这是对users表的参考。
  • 还有一个数据透视表library_user为所有的用户谁可以一个库。

    public function librariesAssociatedViaPivot() 
    { 
        return $this->belongsToMany(Library::class); 
    } 
    

    我还可以创建一个函数来获取通过创建库:

这样我就可以通过创建一个方法User模型这样获得通过枢轴表关联到用户的所有库User

public function librariesCreatedByUser() 
{ 
    return $this->hasMany(Library::class); 
} 

,但我要的是User创造库+天秤座ries User可以看到。换句话说,我想混的两种功能,并能够通过调用看到了User所有库:

$users->libraries 

我应该把这个库的方法?

public function libraries() 
{ 
    // ... ? 
} 

备注:我不想在数据透视表中添加创建者。

回答

0

所以和$user->librariesCreatedByUser都返回CollectionLibrary s?你想结合两者吗? 在这种情况下,只要做到这一点:

public function libraries() 
{ 
    return $this->librariesAssociatedViaPivot->merge($this->librariesCreatedByUser); 
} 

,并使用$user->libraries()

+0

好的谢谢。尽管如此,我不能使用'$ users-> libraries',并且不能使用查询生成器的流畅API(类似于'$ users-> libraries() - > orderBy('id')') –

+0

如果你想用它作为'$ user-> libraries',你可以命名函数'getLibrariesAttribute()'。见[这里](https://laravel.com/docs/5.4/eloquent-mutators#defining-an-accessor)。 您可以使用所有'Collection'方法,参见[这里](https://laravel.com/docs/5.4/collections#available-methods)。 – Aegir

+0

这是因为它正在返回一个集合。使用收集方法,而不是像['sortBy'](https://laravel.com/docs/5.4/eloquent-collections#available-methods)。 –