2017-04-26 102 views
2

我被困在這種情況下,我複製它的一個例子,從symfony的文件,這裏它的外觀:主義一對多關係不取相關實體

興業

/** 
* @ORM\Entity 
*/ 
class Category 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue 
    */ 
    private $id; 
    /** 
    * @ORM\OneToMany(targetEntity="Product", mappedBy="category", fetch="EAGER") 
    */ 
    private $products; 

    public function __construct() 
    { 
     $this->products = new ArrayCollection(); 
    } 

    public function products(): Collection 
    { 
     return $this->products; 
    } 

    public function id() 
    { 
     return $this->id; 
    } 
} 

及相關產品類

/** 
* @ORM\Entity 
*/ 
class Product 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="products") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    */ 
    private $category; 

    public function __construct($category) 
    { 
     $this->category = $category; 
    } 

    public function id() 
    { 
     return $this->id; 
    } 

    public function category() 
    { 
     return $this->category; 
    } 
} 

TEST

現在我的測試代碼這個片段,我想獲取類別,並能夠得到它的產品:

$cat = new Category(); 
$prod = new Product($cat); 

$this->entityManager->persist($prod); 
$this->entityManager->persist($cat); 
$this->entityManager->flush(); 

$crepo = $this->getEntityManager()->getRepository(Category::class); 
$c = $crepo->findAll()[0]; 

var_dump(get_class($c->products()), $c->products()->count()) 

我所得到的是預計PersistentCollection類的產品,但計數爲0而應該有1個產品。

我可以看到,我有合適的外鍵設置適當的類別和產品記錄的數據庫。

替代方法

我調試PersistentCollection產品,可以看到它的標誌設置爲初始化= TRUE。有了這個我可以強制這個工作,通過呼籲

$c->products()->setInitialized(false); 
$c->products()->initialize(); 

但afaik這不是它應該如何工作,應該嗎?

+0

看起來像你期待學說用你的'新Product'構造函數,但它不是由學說稱爲收集工作,檢查了這一點:HTTP://文檔.doctrine-project.org /項目/學說-ORM/EN /最新/參考/ architecture.html#實體 – LBA

+0

你爲什麼不使用級聯堅持? [理解級聯堅持學說操作](http://www.inanzzz.com/index.php/post/hry2/understanding-the-cascade-persist-operations-in-doctrine) – BentCoder

+0

感謝響應,但既不的這是原因。我並不期望這個教義可以調用構造函數,也可以節省工作量,所以級聯持久性是沒有關係的。我設法找出原因併發布和回答 –

回答

0

我設法找到了答案。它基本上工作,但不是在同一個進程中運行。如果我將腳本分成兩部分 - 第一部分繼續存在,第二部分檢索數據,則產品集合將包含與類別相關的產品。

這是因爲當它在單個程序原則是做不知道有問題的類別有產品,因爲它檢索它只是保存在同一個對象,這是我們創建了上面幾行,實體管理器將不使用數據庫填充集合,但將使用類別對象中的一個。而類別對象不具有產品的產品集合,因爲既不是產品構造或其他地方一樣$this->products()->add($category)沒有呼叫。只有強制重新初始化,因爲那就真的從檢索數據庫產品