2012-06-29 48 views
0

我有一個與Steps(OneToMany)和Article ManyToOne的步驟有關的表文章。Doctrine/Symfony2從關係表中獲取數據

我得到文章摘要:

$articles = $this->getDoctrine() 
      ->getRepository("IftodiDesignBundle:Article") 
      ->findAll(); 

而且用foreach我想告訴所有的文章和步驟:

foreach($articles as $article) 
    { 
     $steps = $this->getDoctrine() 
       ->getRepository("IftodiDesignBundle:Steps") 
       ->createQueryBuilder('s') 
       ->where('s.article = \''.$article.'\'') 
       ->getQuery() 
       ->execute(); 

     echo "<b>".$article->getTitle()."</b><br />"; 
     echo $article->getText()."<br />"; 
    } 

我不知道如何從表步驟usign表獲取數據使用Doctrine生成的文章和方法getSteps()。

請幫幫我。


感謝您的回答。

在表格文章,我有:

/** 
* @ORM\OneToMany(targetEntity="Steps", mappedBy="Steps",cascade={"persist"}) 
* @ORM\JoinColumn(name="id", referencedColumnName="id_article") 
*/ 
protected $steps; 

在表的步驟:

/** 
* @ORM\ManyToOne(targetEntity="Article", inversedBy="steps") 
* 
*/ 
protected $article; 

當我這樣做:

$articles = $this->getDoctrine() 
      ->getRepository("IftodiDesignBundle:Article") 
      ->findAll(); 

如果我做的:

foreach($articles as $article) 
    { 
     $steps = $article->getSteps(); 

我收到錯誤:

Notice: Undefined index: Steps in /var/www/design/vendor/doctrine/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 1280 

如果我這樣做:

$articles = $this->getDoctrine() 
      ->getRepository("IftodiDesignBundle:Article") 
      ->findAll(); 
    foreach($articles as $article) 
    { 
     //Queries to DB 
     $steps = $this->getDoctrine() 
      ->getRepository("IftodiDesignBundle:Steps") 
      ->findBy(array(
       "article" => $article->getId() 
      )); 
     $media = $this->getDoctrine() 
       ->getRepository("IftodiDesignBundle:Media") 
       ->findBy(array(
        "step" => $steps[0]->getId() 
       )); 

我可以得到我需要的數據,但這裏有多個詢問到數據庫。

+0

幾個最佳實踐我知之甚少主義,但我會本能地嘗試'$物品─> getSteps();'。你嘗試過嗎? – AJJ

+0

是的,一個嘗試過,但一個接收和錯誤。 –

回答

1

從註釋刪除@ORM\JoinColumn(name="id", referencedColumnName="id_article") - 學說將映射你的以合理的默認值與MySQL關聯。

一旦刪除,重新生成SQL:doctrine:schema:update --force

此外,如果您循環您的文章,讓你的腳步,你最好在你的倉庫編寫自定義方法,否則每次調用->getSteps()主義會創建一個SQL調用(想象一下循環了100多篇文章 - 你最終會對數據庫進行101次調用!)

爲了避免這種情況,你可以把像這樣的方法在你的倉庫

public function all() 
{ 
    $queryBuilder = $this->getEntityManager()->createQueryBuilder(); 

    $queryBuilder 
     ->select('Article', 'Steps') 
     ->from('IftodiDesignBundle:Article') 
     ->leftJoin('Article.steps', 'Steps') 
    ; 

    // consider using ->getArrayResult() to use less memory 
    return $queryBuilder->getQuery()->getResult(); 
} 

我放在一起在blog post

+0

謝謝。我也有這個問題。我修改了Annotation如何表達,刪除和重新創建數據庫。現在的錯誤是:注意:未定義的索引:/var/www/design/vendor/doctrine/lib/Doctrine/ORM/Query/SqlWalker.php第746行中的步驟; @PeterSmith請幫忙解決。 –

+0

當我做$ steps = $ article-> getSteps()時,這裏是var_dump($ steps)。 http://pastebin.com/CZsxjRcg –

0

好,

假設你有在文章模型如下關係:

/** 
* @OneToMany(targetEntity="Step", mappedBy="article") 
* @JoinColumn(name="id_article", referencedColumnName="id_article_in_step") 
*/ 
protected $steps; 

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

,你將能夠做到$article->getSteps();