所以我试图实现一个好友列表,上面是我为我的简单项目制作的SQL图,并在生成模型之后。我意识到Gii生成模型的方式有问题。
我想与User建立多对多的关系,但这就是我所得到的:
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类与它本身没有任何关系,我期望User内部的getUsers(),但它没有生成它。我最初想过不用连接表制作模型,但我这样做只是为了看看会发生什么。我认为我不需要它。所以我不确定如何正确地做到这一点?我是否需要摆脱我的连接表模型,是否需要手动建立用户与用户和用户之间的关系?我想过在User和Message中做多对多,在User for User中做多对多。这是对的吗?告诉我,如果我错了。谢谢。
答案 0 :(得分:2)
你是一个真正的方式。您需要一个联结表来实现您的目标。在您完成此操作时,您必须定义两个模型:User
和Friend
。现在,在您的User
模型上,您必须定义一个关系以获取所有朋友的列表,假设将其称为getFriendsLists
:
public function getFriendsLists()
{
return $this->hasMany(Friend::className(), ['userId' => 'id']);
}
此关系表示“获取与我相关的所有帐户,即如果我的ID为102
,则此关系会返回friend
表的所有记录userId
s 102
”。好吧,现在我们让所有朋友都与User
模型建立关系,让他给他打电话getFriends
:
public function getFriends()
{
return $this->hasMany(User::className(), ['friendId' => 'id']
->via('friendsList');
}
请注意,'friendsList'
作为via
方法的参数,是我们在此答案之上的预定义关系。现在,您可以轻松获得我们示例的所有帐户(ID为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
关系。