2014-11-15 3 views
0

두 엔터티 Item과 ItemPrice 사이의 관계를 지정하고 싶습니다. 항목은 가격을 가질 수 있지만 꼭 가질 필요는 없으므로 SQL에 왼쪽 결합과 같은 것이어야합니다. OneToOne 관계, nullable = true 인 JoinColumn을 사용하고 있습니다. EntityNotFoundException 예외입니다.Doctrine - OneToOne 관계 - EntityNotFoundException

class Item 
{ 

/** 
* @ORM\Column(type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
protected $item_id; 

/** 
* @ORM\Column(type="string") 
*/ 
protected $name; 

/** 
* @ORM\Column(type="string") 
*/ 
protected $image_file; 

/** 
* @ORM\OneToOne(targetEntity="ItemPrice") 
* @ORM\JoinColumn(name="item_id", referencedColumnName="item_id", nullable=true) 
*/ 
protected $price; 
... 
} 


class ItemPrice 
{ 

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

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

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

/** 
* @ORM\Column(type="integer") 
*/ 
protected $bronze; 
... 
} 

테이블 :

CREATE TABLE `item` (
`item_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`name` varchar(150) NOT NULL, 
`image_file` varchar(100) DEFAULT NULL, 
PRIMARY KEY (`item_id`), 
UNIQUE KEY `uk_item_name` (`name`)); 

CREATE TABLE `item_price` (
`item_id` int(11) NOT NULL, 
`gold` int(11) NOT NULL DEFAULT '0', 
`silver` int(11) NOT NULL DEFAULT '0', 
`bronze` int(11) NOT NULL DEFAULT '0', 
PRIMARY KEY (`item_id`)); 

내가 단방향 OneToOne라고 무슨 짓을했는지 생각 : 여기 내 코드는 http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#one-to-one-unidirectional 내 의견으로는 정확히 내가 필요된다.

+1

네임 스페이스 정의를 제공 할 수 있습니까? – cptnk

+0

내 대답으로 문제를 해결하는 데 성공 했습니까? – Wilt

답변

0

매핑이 잘못되었다고 생각합니다.

ItemPrice와 (과) 연결된 의 item_id 조인 열에는 nullable=true을 입력하십시오. item_idnull이면 연관된 ItemPrice가 없음을 의미합니다. 그러나 item_id는 ORM은 항상 당신은 ItemPrice 관계의 소유 측면해야 중 하나 EntityNotFoundException의 결과로 당신의 Item에 대한 ItemPrice을 찾기 위해 노력할 것 또는 당신이해야하므로 항상 값을 가질 것이다 따라서 기본 ID 열이며, ItemPriceprice_id을 입력하고 이것을 조인 열로 사용하십시오.

테이블 생성/삽입과 엔티티 정의 유효성 검사에 Doctrine을 사용하는 것이 좋습니다. 그런 다음 이러한 종류의 문제는 발생하지 않습니다.