Столкнулся с довольно неочевидной для меня проблемой, когда решил сделать небольшой чат. На этапе проектирования БД столкнулся с очевидной проблемой "отношений друзей". Т.е. у меня есть 2 пользователя (оба из таблицы users), на основе их отношения есть М-М таблица chats, где есть 2 соответствующих поля: first_u_id и second_u_id. При выборке из Eloquent, очевидно, сталкиваюсь с проблемой, что приходится мёрджить отношения, что-то вроде этого:
/**
* Getter for combining all user chats
*
* @return Collection
*/
public function getChatsAttribute() : Collection {
return $this->my_chats->merge($this->add_chats);
}
/**
* Chats, initiated by current user instance
*
* @return BelongsToMany
*/
public function my_chats() : BelongsToMany
{
return $this->belongsToMany(User::class, 'users_chats', 'first_user_id', 'second_user_id', 'id', 'id')->using(UsersChats::class)->as('chats');
}
/**
* Chats where the user was invited
*
* @return BelongsToMany
*/
public function add_chats() : BelongsToMany
{
return $this->belongsToMany(User::class, 'users_chats', 'second_user_id', 'first_user_id', 'id', 'id')->using(UsersChats::class)->as('chats');
}
Минус данного подхода очевиден - возврат коллекции, а не билдера, а значит все последующие надстройки не работают. В голову пришло решение что-то покрутить с представлениями, но, как будто это не самое оптимальное решение, да и в sql я не очень. Как вообще решают эту проблему? Хотелось бы оставить эту логику на уровне модели.