2012-06-29 45 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();