Отношение Laravel 5 hasMany на двух столбцах

возможно ли иметь отношение hasMany на двух столбцах?

моя таблица имеет две колонки user_id и related_user_id.

Я хочу, чтобы мое отношение соответствовало любому из столбцов.

в моей модели у меня есть

public function userRelations()
{
    return $this->hasMany('AppUserRelation');
}

который запускает запрос:select * from user_relations where user_relations.user_id in ('17', '18').

запрос, который мне нужно запустить:

select * from user_relations where user_relations.user_id = 17 OR user_relations.related_user_id = 17 

EDIT:

Я использую нетерпеливую загрузку, и я думаю, что это повлияет на то, как она должна будет работа.

$cause = Cause::with('donations.user.userRelations')->where('active', '=', 1)->first();

2 ответов


Я не думаю, что это можно сделать именно то, что вы просите.

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

public function userRelations() {
    return $this->hasMany('App\UserRelation');
}

public function relatedUserRelations() {
    return $this->hasMany('App\UserRelation', 'related_user_id');
}

public function allUserRelations() {
    return $this->userRelations->merge($this->relatedUserRelations);
}

таким образом, вы по-прежнему получаете преимущество нетерпеливой загрузки и кэширования отношений на модели.

$cause = Cause::with('donations.user.userRelations', 
        'donations.user.relatedUserRelations')
    ->where('active', 1)->first();

$userRelations = $cause->donations[0]->user->allUserRelations();

Compoships добавляет поддержку отношений с несколькими столбцами в Laravel 5's Eloquent.

Он позволяет указать отношения, используя следующий синтаксис:

public function b()
{
    return $this->hasMany('B', ['key1', 'key2'], ['key1', 'key2']);
}

где оба столбца должны совпадать.