持有现有实体外键的实体

时间:2014-10-28 11:38:03

标签: php doctrine-orm

我有一个与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表中始终为空。我正在寻找一个解决方案,但我找不到一个。我有一种感觉,有一个简单的解决方案,我错过了一些东西。怎么了?

提前致谢。

1 个答案:

答案 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;
     }
}

这应该可以解决您的问题。