我有一个与User
实体有ManyToOne
关系的UserGroup
实体。我有一个表单,它根据一个用数据库中的值填充的select元素构造一个User
实体,并选择UserGroup
。示例对象如下所示:
object(User\Entity\User)[407]
protected 'id' => null
protected 'username' => string 'SomeTest' (length=8)
protected 'password' => string '$2y$12$9mOe1ebW/bfpzXHZ.SoKx.B6PpWpogkXq/OIwFajojo3lpDmcY3ma' (length=60)
protected 'email' => string 'test@test.com' (length=13)
protected 'firstName' => string 'First' (length=5)
protected 'lastName' => string 'Last' (length=4)
protected 'isActive' => boolean true
protected 'group' =>
object(User\Entity\UserGroup)[507]
protected 'id' => int 2
protected 'name' => string 'Salesman' (length=8)
在此示例中,ID为2的用户组已存在于数据库中。问题是在我的user
表中,未填充user_group_id
列。相反,当我坚持实体时,它被留空(它暂时可以为空)。下面是我的两个实体和持久化实体的代码。
用户
namespace User\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="mydb.user")
*/
class User
{
/**
* @var int
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
// Some fields left out
/**
* @var UserGroup
* @ORM\ManyToOne(targetEntity="User\Entity\UserGroup")
* @ORM\JoinColumn(name="user_group_id", referencedColumnName="id")
*/
protected $group;
// Getters and setters
}
用户组
namespace User\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="mydb.user_group")
*/
class UserGroup
{
/**
* @var int
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @var string
* @ORM\Column(type="string", length=50, nullable=false)
*/
protected $name;
// Getters and setters
}
业务逻辑
public function create(\User\Entity\User $user)
{
// Simplified code
$this->objectManager->persist($user);
$this->objectManager->flush();
}
我尝试了上述的许多变体,但问题是user_group_id
外键在我的user
表中始终为空。我正在寻找一个解决方案,但我找不到一个。我有一种感觉,有一个简单的解决方案,我错过了一些东西。怎么了?
提前致谢。
答案 0 :(得分:0)
问题可能来自于主义拥有/反面概念的问题,更多解释here
您需要在User中添加inversedBy属性,在Group中添加属性$ users并在UserGroup中自定义自动生成的setter。
class User
{
/**
* @var UserGroup
* @ORM\ManyToOne(targetEntity="User\Entity\UserGroup", inversedBy="users")
* @ORM\JoinColumn(name="user_group_id", referencedColumnName="id")
*/
protected $group;
}
class UserGroup
{
/**
* @var User
*
* @ORM\OneToMany(targetEntity="User", mappedBy="group")
*/
protected $users;
public function addUser(User $user)
{
$user->setGroup($this);
$this->users[] = $user;
return $this;
}
}
这应该可以解决您的问题。