在 Yii2 中创建一对多关系
Creating a one-to-many relationship in Yii2
假设我们有两个实体:用户和 Post。
据我了解,要在 User 和 Post 之间建立一对多关系,您需要执行以下操作:
class User {
...
public function getPosts()
{
return $this->hasMany(Order::className(), ['user_id' => 'id']);
}
}
class Post {
...
public function getUser()
{
return $this->hasOne(Order::className(), ['id' => 'user_id']);
}
}
这样对吗?为了使一切正常,我还需要添加什么吗? Yii2 文档对我来说不是很清楚。
是的,这就足够了(除了你插入了 Order
class 名称),但是也建议为关系添加 PHPDoc:
User
型号:
/**
* ...
*
* @property Post[] $posts
*/
class User
{
/**
* @return \yii\db\ActiveQuery
*/
public function getPosts()
{
return $this->hasMany(Post::className(), ['user_id' => 'id']);
}
}
Post
型号:
/**
* ...
*
* @property User $user
*/
class Post
{
/**
* @return \yii\db\ActiveQuery
*/
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'user_id']);
}
}
然后当您调用 $user->posts
或 $post->user
时,如果您使用的是 IDE,您将获得完全自动完成功能。它也很有用,因为您只需查看文件顶部就可以看到关系列表,因为关系作为虚拟属性访问,$user->getPosts()
调用将 return yii\db\ActiveQuery
对象而不是 \yii\db\ActiveRecord
数组。最好用换行符将它们与模型属性分开(它们也被添加用于自动完成和查看相应数据库的结构 table 而无需查看数据库)。
顺便说一句,如果您使用 Gii 生成模型,如果您正确指定了外键,关系和 PHPDoc 将自动生成。
注意,如果不需要使用$post->user
,可以省略Post
模型中的user
关系声明。您可以声明仅在使用时需要的关系。
假设我们有两个实体:用户和 Post。
据我了解,要在 User 和 Post 之间建立一对多关系,您需要执行以下操作:
class User {
...
public function getPosts()
{
return $this->hasMany(Order::className(), ['user_id' => 'id']);
}
}
class Post {
...
public function getUser()
{
return $this->hasOne(Order::className(), ['id' => 'user_id']);
}
}
这样对吗?为了使一切正常,我还需要添加什么吗? Yii2 文档对我来说不是很清楚。
是的,这就足够了(除了你插入了 Order
class 名称),但是也建议为关系添加 PHPDoc:
User
型号:
/**
* ...
*
* @property Post[] $posts
*/
class User
{
/**
* @return \yii\db\ActiveQuery
*/
public function getPosts()
{
return $this->hasMany(Post::className(), ['user_id' => 'id']);
}
}
Post
型号:
/**
* ...
*
* @property User $user
*/
class Post
{
/**
* @return \yii\db\ActiveQuery
*/
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'user_id']);
}
}
然后当您调用 $user->posts
或 $post->user
时,如果您使用的是 IDE,您将获得完全自动完成功能。它也很有用,因为您只需查看文件顶部就可以看到关系列表,因为关系作为虚拟属性访问,$user->getPosts()
调用将 return yii\db\ActiveQuery
对象而不是 \yii\db\ActiveRecord
数组。最好用换行符将它们与模型属性分开(它们也被添加用于自动完成和查看相应数据库的结构 table 而无需查看数据库)。
顺便说一句,如果您使用 Gii 生成模型,如果您正确指定了外键,关系和 PHPDoc 将自动生成。
注意,如果不需要使用$post->user
,可以省略Post
模型中的user
关系声明。您可以声明仅在使用时需要的关系。