2017-02-21 35 views
-1

Я работаю над CRM, где у меня есть модель User, которая может иметь много-много отношений с другими пользовательскими и тип отношений, которые определяются через сводную таблицу.Laravel 5.3 От многих до многих отношений с той же моделью

Например:

Тим -> Том (сотрудник)

Tim -> Стив (член семьи)

Tim -> Jon (соседи)

В моем пользователе модель У меня есть это, когда я использую user1_id и user2_id из сводной таблицы в качестве внешних ключей:

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

Которая отлично работает в одном направлении. Поэтому, если я позвоню так:

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

Это работает так, как ожидалось, и я получу Тома Стива и Джона в качестве результатов. Теперь, если бы я использовал идентификатор Тома в этом запросе, Тим не вернется как отношения, так как он ищет в user1_id, когда идентификатор Тома хранится в user2.

Есть ли решение потянуть записи, если есть совпадение от внешнего ключа? Я не хочу хранить 2 записи для каждой связи.

+0

Какова ваша сводная таблица? вы, кажется, передаете «null». – EddyTheDove

+0

Это user_user. Я передаю null, так как я следил за соглашением о присвоении имен laravel и по умолчанию оно присваивается при передаче 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 запроса для одного набора результатов. Даже если бы я это сделал, как бы объединить 2 набора результатов в одну коллекцию? – tecshaun

+0

Спасибо, что помог мне, хотя я единственный, кто пытается тебе помочь. В любом случае, за то, что вы пытаетесь сделать, вам придется отказаться от Eloquent и получить его с собственным запросом, где вы проверяете «user1_id» или «user2_id». – EddyTheDove

+0

Я не спустил вас вниз, и если бы я это сделал, это было не преднамеренно. Просто на самом деле поддерживал вас. – tecshaun