2016-01-12 67 views
2

假设我们有两个实体:User和Post。在Yii2中创建一对多关系

在我的理解,才能有用户和邮政之间存在一个一对多的关系,你需要做到以下几点:

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文档对我来说不是很清楚。

+0

请更具体。什么不可行?或者你在做什么?代码看起来是正确的,如果你想和Order模型建立关系,但是我想你想在Post和User类之间做它们,这是正确的吗? –

回答

4

是的,这就够了(除非你插入Order类名来代替),但是它也建议加入PHPDoc的对关系:

User型号:

/** 
* ... 
* 
* @property Post[] $posts 
*/ 
class User 
{ 
    return $this->hasMany(Post::className(), ['user_id' => 'id']); 
} 

Post型号:

/** 
* ... 
* 
* @property User $user 
*/ 
class Post 
{ 
    return $this->hasOne(User::className(), ['id' => 'user_id']); 
} 

然后当您拨打$user->posts$post->user时,您将获得完整的自动填充如果你使用的是IDE。这也很有用,因为只需查看文件顶部即可看到关系列表,因为作为虚拟属性访问的关系,$user->getPosts()调用将返回yii\db\ActiveQuery对象而不是\yii\db\ActiveRecord数组。最好使用linebreak将它们与模型属性分开(它们也会添加用于自动完成,并在不查看数据库的情况下查看相应数据库表的结构)。顺便说一句,如果你用Gii生成模型,如果你正确指定了外键,关系和PHPDoc将自动生成。

请注意,如果您不需要使用$post->user,则可以在Post模型中省略user关系声明。您可以声明仅用于需要的关系。