Гии не признает отношения "многие ко многим" с самим собой?

введите описание изображения здесь

Поэтому я пытаюсь реализовать список друзей, выше приведена диаграмма SQL, которую я сделал для моего простого проекта и после генерации моделей. Я понял, что что-то не так с тем, как Gii создал модель.

Я хотел установить отношения "многие ко многим" с самим пользователем, но вот что я получил:

class User {
...

    public function getPosts()
    {
        return $this->hasMany(Post::className(), ['userId' => 'id']);
    }
}

class Friend {
...

    public function getFriend()
    {
        return $this->hasOne(Member::className(), ['id' => 'friendId']);
    }
}

Класс User не имеет никакого отношения к самому себе, я ожидал что-то вроде getUsers() внутри User, но он не генерировал это. Первоначально я думал о том, чтобы не делать модель с соединительной таблицей, но я сделал это просто, чтобы посмотреть, что произойдет. Я не думаю, что мне это нужно. Так что я не уверен, как это сделать правильно? Нужно ли мне избавляться от моделей Junction Table и нужно ли вручную устанавливать связь между пользователем и пользователем и сообщением? Я думал о том, чтобы сделать "многие ко многим" в "Пользователь и сообщение" и "многие ко многим" в "Пользователь для пользователя". Это правильно? Скажи мне, если я ошибаюсь. Спасибо.

1 ответ

Решение

Вы на верном пути. Вам нужна соединительная таблица для реализации вашей цели. Легко, как вы сделали это, вы должны определить две модели: User а также Friend, Теперь на вашем User модель сначала вы должны определить отношение, чтобы получить список всех друзей, предположим, назовите его getFriendsLists:

public function getFriendsLists()
{
    return $this->hasMany(Friend::className(), ['userId' => 'id']);
}

Это отношение говорит, что "Получить мне все аккаунты, которые связаны со мной, т.е. если мой идентификатор 102, это отношение возвращает всю запись friend таблица, что их userIdс 102"Ну, теперь мы получаем всех друзей с отношениями на User модель, пусть позвонит ему getFriends:

public function getFriends()
{
    return $this->hasMany(User::className(), ['friendId' => 'id']
                ->via('friendsList');
}

Заметить, что 'friendsList' как параметр via Метод, это наше заранее определенное отношение поверх этого ответа. Теперь вы легко можете получить все аккаунты, которые являются друзьями нашего примера (пользователь с идентификатором 102):

public FriendController extends Controller
{
    // Some code goes here!
    public function actionFriendList($id)
    {
        $user = User::findOne($id);
        $friends = $user->friends;

        return $this->render('friend-list', ['friendsArray' => $friends]);
    }
}

И используйте их на своем friend-list просмотреть файл как $friendsArray переменная. Дополнительное примечание, что $user->friends использование friends отношение, которое вы определили на User модель с getFriends метод.

Другие вопросы по тегам