0

在此处输入图像描述

所以我正在尝试实现一个friendlist,上面是我为我的简单项目制作的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 类与自身没有任何关系,我期望 User 内部有 getUsers() 之类的东西,但它没有生成它。我最初考虑不使用连接表制作模型,但我这样做只是为了看看会发生什么。我不认为我需要它。所以我不确定如何正确执行此操作?我是否需要摆脱我的连接表模型,是否需要手动建立用户与自身和用户与消息之间的关系?我想过在 User 和 Message 中做一个多对多,在 User for User 中做一个多对多。这是正确的吗?告诉我我是否错了。谢谢你。

4

1 回答 1

2

你走在真正的道路上。您需要一个联结表来实现您的目标。轻松完成此操作后,您必须定义两个模型:UserFriend. 现在在你的User模型上,首先你必须定义一个关系来获取所有朋友的列表,假设称之为getFriendsLists

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

该关系表示“获取与我相关的所有帐户,即如果我的 id 是102,则此关系返回他们s 所在的friend表的所有记录”。好吧,现在我们得到了所有与模型有关系的朋友,我们打电话给他:userId102UsergetFriends

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

请注意,'friendsList'as 是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定义的关系。UsergetFriends

于 2016-01-19T06:35:19.310 回答