symfony 2学说关系onetoone

时间:2013-12-18 08:38:57

标签: symfony doctrine-orm one-to-one

如何获取和设置实体巫婆关系,就像我的例子。

我有错误:

  

类型Miejsce\ObiektyBundle\Entity\UsersInformatio n的实体缺少字段“user_id”的已分配ID。此实体的标识符生成策略要求在调用EntityManager#persist()之前填充ID字段。如果您想要自动生成标识符,则需要相应地调整元数据映射。

在php控制器中 - 我尝试以这种方式保存新项目:

$product = new Userstest();

$product->setUsername('aa')->setPassword('123456');

$product->setInformation((new UsersInformation())->setCompany('firma'));

$em = $this->getDoctrine()->getManager();
$em->persist($product);
$em->flush();

当我以这种方式保存时

$code = 'test3';

    $product->setUsername($code)->setPassword('123456');
    $information = new UsersInformation();
    $information
        ->setEmail($code.'@a.pl')
        ->setUserId($product->getUserId())
    ;


    $product->setInformation($information);


    $em = $this->getDoctrine()->getManager();
    $em->persist($product);
    $em->flush();

 print_r($product);

并拥有* @ORM \ GeneratedValue(strategy =“AUTO”)UsersInformation.for user_id 有:

Miejsce\ObiektyBundle\Entity\Userstest Object
(
    [user_id:protected] => 9
    [information:protected] => Miejsce\ObiektyBundle\Entity\UsersInformation Object
        (
            [user_id:protected] => 5
            [user:protected] => 
            [email] => test3@a.pl
            [gender] => 
            [company] => 
        )

    [username:protected] => test3
    [password:protected] => 123456
)

所以不行, 但是当删除* @ORM \ GeneratedValue(strategy =“AUTO”)

得到错误: Miejsce \ ObiektyBundle \ Entity \ UsersInformation类型的实体缺少字段'user_id'的已分配ID。此实体的标识符生成策略要求在调用EntityManager#persist()之前填充ID字段。如果您想要自动生成标识符,则需要相应地调整元数据映射。

Miejsce\ObiektyBundle\Entity\Userstest Object
(
    [user_id:protected] => 9
    [information:protected] => Miejsce\ObiektyBundle\Entity\UsersInformation Object
        (
            [user_id:protected] => 5
            [user:protected] => 
            [email] => test3@a.pl
            [gender] => 
            [company] => 
        )

    [username:protected] => test3
    [password:protected] => 123456
)

实体:

<?php
namespace Miejsce\ObiektyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="test_user")
 */
class Userstest
{
/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 *
 */
protected $user_id;


/**
 * @ORM\OneToOne(targetEntity="UsersInformation", mappedBy="Users", cascade={"persist", "remove"})
 */
protected $information;


/**
 * @ORM\Column(type="string", length=255)
 */
protected $username;


/**
 * @ORM\Column(type="string", length=32)
 */
protected $password;

<?php
namespace Miejsce\ObiektyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
 * @ORM\Entity
 * @ORM\Table(name="test_userInfo")
 */
class UsersInformation
{

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 */
protected $user_id;

/**
 * @ORM\OneToOne(targetEntity="Userstest", inversedBy="information")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
 */
protected $user;


/**
 * @ORM\Column(type="string", length=255)
 */
public $email;

/**
 * @ORM\Column(type="string", length=1)
 */
public $gender;

/**
 * @ORM\Column(type="string", length=255)
 */
public $company;

2 个答案:

答案 0 :(得分:4)

@ORM\GeneratedValue(strategy="AUTO")添加到$user_id课程的UserInformation或使用setUserId为您的实体设置显式ID。

<强>解释

错误告诉您,Doctrine需要一个ID(您的实体的主键)才能将实体持久保存到数据库。所以你必须设置一个id或让doctrine为你生成一个id。使用annoation @ORM\GeneratedValue(strategy="AUTO"),您可以告诉Doctrine为此实体生成适当的ID,而不必担心它。

修改

如果您要实现UserstestUsersinformation具有相同的ID,您可以这样做:

$em = $this->getDoctrine()->getManager();

$product = new Userstest();
$product->setUsername('aa')->setPassword('123456');

$em->persist($product);
$em->flush();

$information = new UsersInformation();
$information->setCompany('firma');
$information->setUserId($product->getUserId()); // Set the User Id

$product->setInformation($information);

$em->persist($information);
$em->persist($product);
$em->flush();

答案 1 :(得分:0)

如果您可以自由地根据需要修改数据库,我会选择一对一关系的基本实现(这意味着您的一个表中的额外列)并放弃共享ID的要求

如果您坚持,可能下面给出的链接是解决方案(取决于您使用的Doctrine2的版本):

http://docs.doctrine-project.org/en/latest/tutorials/composite-primary-keys.html#use-case-2-simple-derived-identity

文档说明:

  

只有Doctrine 2.1支持通过外国实体进行身份验证

我不确定这是否意味着它仅在版本2.1中受支持或者从版本2.1开始支持它

请记住,与普通的一对一关系相比,这种解决方案会受到性能影响。