Отношение 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']);
}
где оба столбца должны совпадать.