2013-12-18 173 views
1

如何獲取和設置實體女巫onetoone關係像我的例子。symfony 2學說關係onetoone

我有錯誤:

Entity of type Miejsce\ObiektyBundle\Entity\UsersInformatio n is missing an assigned ID for field ' user_id '. The identifier generation strategy for this entity requires the ID field to be populated before EntityManager#persist() is called. If you want automatically generated identifiers instead you need to adjust the metadata mapping accordingly.

在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] => [email protected] 
      [gender] => 
      [company] => 
     ) 

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

這樣不行, 但當刪除* @ORM \ GeneratedValue(策略= 「AUTO」)

得到錯誤: 實體類型Miejsce \ ObiektyBundle \實體\ UsersInformation是缺少分配的ID字段'user_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] => [email protected] 
      [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; 

回答

4

添加@ORM\GeneratedValue(strategy="AUTO")$user_idUserInformation類或使用setUserId設置明確的ID對你的實體。

說明:

的這個錯誤告訴你,那個學說需要一個ID(你的實體的主鍵),然後才能堅持實體到數據庫。所以你必須設置一個ID或讓教條爲你生成一個ID。通過@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(); 
+0

但我需要Userstest.user_id == UsersInformation.user_id所以當我把新用戶新UsersInformation從用戶獲取ID - 如何做到這一點? –

+0

編輯我的答案...檢查是否可以解決您的問題。 – Syjin

+0

我編輯問 - 兩種方式不要像我需要的工作 - user_id用戶信息未填充 - 我必須先保存Userstest然後添加UsersInformation獲取ID?是不可能的,這是自動值? –

0

如果你可以自由地修改數據庫您需要我去基本實現一對一的關係(這意味着你的一個表中有一個額外的列),並放棄共享ID的要求。

如果你堅持,也許下面的鏈接給出的是解決方案(取決於Doctrine2的版本使用):

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

的文檔狀態:

Identity through foreign entities is only supported with Doctrine 2.1

我不知道這是否意味着它僅支持2.1版本或者如果從版本2.1

支持,請記住,這種與普通的一對一關係相比,解決方案具有更高的性能。

+0

我嘗試witchout succcces:http://stackoverflow.com/questions/20663942/symfony2-doctrine-onetoone -complete-示例 –