【问题标题】:Propper entity associations mapping with one entity for join table (Doctrine 2)与连接表的一个实体的适当实体关联映射(学说 2)
【发布时间】:2015-06-18 22:16:45
【问题描述】:

我的 MySQL 数据库中有三个表,它们看起来像这些:

创建表`角色`( `id` 整数(10), `name` varchar(50), `order` tinyint(3) ); 创建表`用户`( `id` 整数(10), `用户名` varchar(50), `密码`字符(60) ); 创建表`user_role`( `id` 整数(10), `user_id` int(10), `role_id` int(10), `order` int(10), KEY `user_id` (`user_id`), KEY `role_id` (`role_id`), CONSTRAINT `user_role_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`), 约束 `user_role_ibfk_2` 外键 (`user_id`) 参考 `user` (`id`) );

注意:我从这些表中删除了一些定义部分,例如 AUTO_INCREMENT,因此只是为了使架构更简单。

我的问题是,我需要将这些表映射到实体类,例如 UserRole 但我不知道如何管理 user_role 表中的 order 列以及如何管理这些实体中的关系。

我的第一个猜测是:

文件User.php

使用 Doctrine\ORM\Mapping 作为 ORM; 使用 Doctrine\Common\Collections\ArrayCollection; /** * 用户实体。 * * @ORM\实体 * @ORM\Table(name="用户") */ 类用户 { /** * @ORM\ID * @ORM\Column(type="整数") * @ORM\GeneratedValue * * @var 整数 */ 受保护的$id; /** * @ORM\ManyToMany(targetEntity="Role", inversedBy="users") * @ORM\JoinTable(name="user_role") * * @var 角色[] */ 受保护的$角色; /** * @ORM\Column(type="string") * * @var 字符串 */ 受保护的$用户名; /** * @ORM\Column(type="string") * * @var 字符串 */ 受保护的$密码; 公共函数 __construct() { $this->roles = new ArrayCollection; } }

文件Role.php

使用 Doctrine\ORM\Mapping 作为 ORM; 使用 Doctrine\Common\Collections\ArrayCollection; /** * 角色实体。 * * @ORM\实体 * @ORM\Table(name="角色") */ 类角色 { /** * @ORM\ID * @ORM\Column(type="整数") * @ORM\GeneratedValue * * @var 整数 */ 受保护的$id; /** * @ORM\ManyToMany(targetEntity="User", mappedBy="roles") * * @var 用户[] */ 受保护的 $users; /** * @ORM\Column(type="string") * * @var 字符串 */ 受保护的$名称; 公共函数 __construct() { $this->users = new ArrayCollection; } }

这些实体将生成三个我需要的表,但user_role 表中没有我真正需要的order 列。把它放在那里很重要。我也可以创建第三个实体,例如 UserRole,但我不知道映射信息会是什么样的。

有什么帮助吗?

【问题讨论】:

  • 订单栏目的是什么?如果您在 user_role 表中需要它,您可能在类中需要它,并且应该创建 UserRole 类。
  • user_role 表中order 列的目的是存储用户在给定角色中的位置信息。可能该表应该重命名为 user_in_role_order 之类的东西,这在语义上似乎更正确,但第三个 UserInRoleOrder 实体类仍然存在问题。映射信息应该是什么样的? Role->users 是否有可能让这个属性直接引用User 并且仍然在Role->users 中拥有按UserInRoleOrder->order 排序的结果集合?我怎样才能做到这一点?我还是教义 2 的新手。

标签: php entity-framework orm doctrine-orm


【解决方案1】:

您已在此处应用 ma​​nyTomany 关系,因此 user_role 是关系表。因此它将仅生成关系列。您可以在表中手动添加新列,但在创建角色时不会填充对于用户,它不会填写订单列。

您应该使用以下属性创建新实体 userRoleOrder userid、roleid 和 order 在用户实体和 userRoleOrder 实体之间使用 oneToOne 关系

【讨论】:

    【解决方案2】:

    在 ManyToMany 关系中归档管理参数的最简单方法是在您的案例 UserAndRole 中创建 SomethingAndSomething 实体类,这是一个快速示例,可以让您了解如何归档您想要的内容

    /** @Table(name="user_role") */
    class UserAndRole
    {
        /** @Column */
        private $id;
    
        // get
    
        /** @ManyToOne(targetEntity="Acme\Entity\User", inversedBy="userAndRoles") */ 
        private $user;
    
        // get / set
    
        /** @ManyToOne(targetEntity="Acme\Entity\Role") */ 
        private $role;
    
        // get / set
    
        /** @Column */
        private $order;
    
        // get / set
    }
    

    这是你的用户类

    /** @Table(name="user") */
    class User
    {
    
        /** @OneToMany(targetEntity="Acme\Entity\UserAndRole", mappedBy="user") */
        private $userAndRoles;
    
        // add / remove / get / set
    }
    

    而在您的控制器/事件等中,您只需这样做

    $userAndRole = new UserAndRole();
    $userAndRole->setUser($user);
    $userAndRole->setRole($role);
    $userAndRole->setOrder($order);
    // PERSIST
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 2014-12-21
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多