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

时间:2016-01-19 01:31:19

标签: sql yii yii2 gii

enter image description here

所以我试图实现一个好友列表,上面是我为我的简单项目制作的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中做多对多。这是对的吗?告诉我,如果我错了。谢谢。

1 个答案:

答案 0 :(得分:2)

你是一个真正的方式。您需要一个联结表来实现您的目标。在您完成此操作时,您必须定义两个模型:UserFriend。现在,在您的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关系。

相关问题