我的MySQL数据库中有三个表,看起来像是theese:
CREATE TABLE `role` ( `id` int(10), `name` varchar(50), `order` tinyint(3) ); CREATE TABLE `user` ( `id` int(10), `username` varchar(50), `password` char(60) ); CREATE TABLE `user_role` ( `id` int(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`), CONSTRAINT `user_role_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) );
注意:我从那些表中删除了一些定义部分,比如AUTO_INCREMENT,这样只是为了保持模式更简单。
我的问题是,我需要将这些表映射到实体类,例如User
和Role
,但我不知道如何管理{{1}中的order
列表以及如何在实体中管理这些关系。
我的第一个猜测是:
档案user_role
use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * User entity. * * @ORM\Entity * @ORM\Table(name="user") */ class User { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue * * @var integer */ protected $id; /** * @ORM\ManyToMany(targetEntity="Role", inversedBy="users") * @ORM\JoinTable(name="user_role") * * @var Role[] */ protected $roles; /** * @ORM\Column(type="string") * * @var string */ protected $username; /** * @ORM\Column(type="string") * * @var string */ protected $password; public function __construct() { $this->roles = new ArrayCollection; } }
档案User.php
use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * Role entity. * * @ORM\Entity * @ORM\Table(name="role") */ class Role { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue * * @var integer */ protected $id; /** * @ORM\ManyToMany(targetEntity="User", mappedBy="roles") * * @var User[] */ protected $users; /** * @ORM\Column(type="string") * * @var string */ protected $name; public function __construct() { $this->users = new ArrayCollection; } }
这些实体将生成我需要的三个表,但Role.php
表中没有我真正需要的order
列。把它放在那里很重要。我也可以创建第三个实例,例如user_role
,但我不知道那时的映射信息是什么。
请帮忙吗?
答案 0 :(得分:0)
你已经在这里应用了 manyTomany 关系,所以user_role是关系表。所以它只生成关系列。你可以在你的表中手动添加新列,但是当你创建一个角色时它不会被填充对于用户,它不会填写订单栏。
您应该创建具有以下属性userid,roleid和order的新实体userRoleOrder 在用户实体和userRoleOrder实体之间使用 oneToOne 关系
答案 1 :(得分:0)
在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