Гии не признает отношения "многие ко многим" с самим собой?
Поэтому я пытаюсь реализовать список друзей, выше приведена диаграмма 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
метод.