@OrbiJ

Организация структуры чатов на laravel?

Столкнулся с довольно неочевидной для меня проблемой, когда решил сделать небольшой чат. На этапе проектирования БД столкнулся с очевидной проблемой "отношений друзей". Т.е. у меня есть 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 я не очень. Как вообще решают эту проблему? Хотелось бы оставить эту логику на уровне модели.
  • Вопрос задан
  • 177 просмотров
Пригласить эксперта
Ответы на вопрос 1
@pantsarny
Проблема в том что вы рассматриваете чат на двоих и только. Выносите всех пиров каждого диалога в отдельную таблицу и все будет хорошо
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы