2017-02-21 128 views
-1

我正在开发一个CRM,其中有一个用户模型,可以与其他用户建立多对多关系,并通过数据透视表定义一种关系类型。Laravel 5.3与同一模型的多对多关系

例如:

蒂姆 - >汤姆(同事)

蒂姆 - >史蒂夫(家庭成员)

蒂姆 - >乔恩(邻居)

在我的用户模型我有这个地方我使用数据透视表中的user1_id和user2_id作为外键:

public function relationships() 
{ 
    return $this->belongsToMany(User::class,null,'user1_id','user2_id')->withTimestamps()->withPivot('type'); 
} 

在一个方向上工作正常。所以,如果我称之为:

User::find($timsID)->relationships; 

能够按照预期工作,我会得到汤姆史蒂夫·乔恩作为结果。现在,如果我在该查询中使用Tom的ID,Tim将不会返回关系,因为当Tom's ID存储在user2中时,它将在user1_id上搜索。

如果有任何外键匹配,是否有解决方案来提取记录?我不想为每个关系存储2条记录。

+0

什么是您的数据透视表?你似乎通过'null'。 – EddyTheDove

+0

它是user_user。由于遵循laravel命名约定,所以我传递null,并且它在默认情况下传递null。 – tecshaun

回答

1

我会假设我有点理解你想要做什么。 Laravel的关系在双向工作。在你的情况下,你只定义了一个方向,但是想要在两个方向上使用它。清除我的意思

public function peopleIKnow() { 
    return $this->belongsToMany(User::class,null,'user1_id','user2_id')->withTimestamps()->withPivot('type'); 
} 

public function peopleWhoKnowMe() { 
    return $this->belongsToMany(User::class,null,'user2_id','user1_id')->withTimestamps()->withPivot('type'); 
} 

这样你就有双向关系。你可以建立在这个想法之上来获得你想要的东西。

+0

谢谢我明白,但在这种情况下,现在我必须进行2个呼叫,为一组结果做2个查询。即使我这样做,我如何将两组结果合并成一个集合? – tecshaun

+0

谢谢你降低我的表现,尽管我是唯一一个试图帮助你的人。无论如何,对于你想要做的事情,你将不得不放弃Eloquent,并通过查询你自己的位置来检查'user1_id'或'user2_id'。 – EddyTheDove

+0

我没有倒下你,如果我这样做,它根本不是故意的。实际上刚刚提高了你的评价。 – tecshaun