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 来实现您的目标。这样做很容易,您必须定义两个模型:User
和 Friend
。现在在你的 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 userId
s 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
关系。
所以我正在尝试实现一个好友列表,上面是我为我的简单项目和生成模型后制作的 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 来实现您的目标。这样做很容易,您必须定义两个模型:User
和 Friend
。现在在你的 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 userId
s 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
关系。