У меня есть таблица подписчики, с:
id, user_id, follower_id, type
type = type of follow, if follow user = 0, page = 1, group = 1
I use the user_id to put the page_id and group_id too.
Теперь проблема, я хочу установить разные отношения, если тип отличается ... Если тип = 0, будет связан с таблицей пользователей и общей таблицей, если тип = 1, будет связан с таблицей страниц ...
Я пробую вот так:
Модель:
public function page_links()
{
return $this->hasMany(Link::class, 'page_id', 'user_id')->Select('links.id', 'links.title', 'links.photo', 'links.country', 'links.friendly_url', 'links.clicks', 'links.description', 'links.suggestions', 'links.count_comments', 'links.url', 'links.shares', 'links.page_id', 'links.tag_id', 'links.created_at')->where('sponsored', 0)->where('scheduled', 0)>where('status', 1)->take(3)->orderBy('id','desc');
}
public function user_links()
{
return $this->hasMany(Share::class, 'user_id', 'user_id')->Select('id', 'link_id', 'user_id', 'shared_in', 'content', 'created_at')->take(3)->orderBy('id', 'desc')->where('type', '=', 0);
}
public function scopeProfile($query) {
return $query
->when($this->type == 0, function($q){
return $q->with('user_links');
})
->when($this->type == 1, function($q){
return $q->with('page_links');
})
->when($this->type == 2, function($q){
return $q->with('group_links');
});
}
Контроллер:
$feed = Feed::Profile()->where('follower_id', auth()->user()->id)
->take(10)
->get();
Но ВСЕ, даже тип 1, возвращает отношение user_links. Не знаю, верна ли связь ...
Кто-нибудь может мне помочь?






Что ж, с моей точки зрения, вам следует изменить свою миграцию.
Вместо того, чтобы иметь свою таблицу с:
id, user_id, follower_id, type
Я сделаю это:
id, user_id, page_id, group_id, follower_id, type
Не делайте таких странных вещей в своей базе данных, просто добавьте 2 поля и / или отношения в таблицу миграции. Установите для него значение unsigned () AND nullable (), так вы сможете быстро узнать, есть ли связь с каждой страницей или группой, и вам не придется делать странные вещи для проверки это: D