在Yii2中创建一对多关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Yii2中创建一对多关系相关的知识,希望对你有一定的参考价值。

假设我们有两个实体: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类名),但是也建议为关系添加phpDoc:

User型号:

/**
 * ...
 *
 * @property Post[] $posts
 */
class User
{

    /**
     * @return yiidbActiveQuery
     */
    public function getPosts()
    {
        return $this->hasMany(Post::className(), ['user_id' => 'id']);
    }

}

Post型号:

/**
 * ...
 *
 * @property User $user
 */
class Post
{

    /**
     * @return yiidbActiveQuery
     */
    public function getUser()
    {
        return $this->hasOne(User::className(), ['id' => 'user_id']);
    }

}

然后,如果您使用IDE,当您调用$user->posts$post->user时,您将获得完全自动完成功能。它也很有用,因为你可以通过查看文件的顶部来查看关系列表,因为关系作为虚拟属性访问,$user->getPosts()调用将返回yiidbActiveQuery对象而不是yiidbActiveRecord数组。最好将它们与linebreak与模型属性分开(它们也被添加用于自动完成并在不查看数据库的情况下查看相应数据库表的结构)。

顺便说一下,如果使用Gii生成模型,如果正确指定了外键,将自动生成关系和PHPDoc。

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

以上是关于在Yii2中创建一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Prisma 可以从关系表中创建一对多关系吗?

如何在 SQL Server 或实体框架中创建没有主键的一对多关系?

在neo4j中创建一对多关系

yii2 一对多关系的对分页造成的影响

与附加字段的一对多关系

用到了yii2 hasMany() 方法,一对多关联