Gii 不承认与自身的多对多关系?

Gii doesn't recognize many-to-many relationship to itself?

所以我正在尝试实现一个好友列表,上面是我为我的简单项目和生成模型后制作的 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']);
    }
}

用户 class 与自身没有任何关系,我希望用户内部有类似 getUsers() 的东西,但它没有生成。我最初考虑不使用连接点 table 制作模型,但我这样做只是为了看看会发生什么。我不认为我需要它。所以我不确定如何正确执行此操作?我是否需要摆脱我的 Junction Table 模型,我是否需要手动建立用户与自身和用户与消息之间的关系?我考虑过在 User 和 Message 中做多对多,在 User for User 中做多对多。这是对的吗?如果我错了,请告诉我。谢谢。

你走的是正道。您需要一个连接点 table 来实现您的目标。这样做很容易,您必须定义两个模型:UserFriend。现在在你的 User 模型上,首先你必须定义一个关系来获取所有朋友的列表,假设称之为 getFriendsLists:

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

这个关系表示"Get me all account that are connected with me, i.e. if my id is 102, this relation return all record of friend table that their userIds are 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]);
    }
}

并将它们作为 $friendsArray 变量用于您的 friend-list 查看文件。额外注意 $user->friends 使用您在 User 模型上用 getFriends 方法定义的 friends 关系。