Doctrine / Symfony2从关系表中获取数据

时间:2012-06-29 11:01:13

标签: symfony1 doctrine doctrine-orm relationship

我有一个与Steps(OneToMany)关联的表文章和与Article ManyToOne关联的步骤。

我收到文章:

$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 />";
    }

我不知道如何从表中获取数据步骤使用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()
                 ));

我可以获得我需要的数据,但这里有更多的DB询问。

2 个答案:

答案 0 :(得分:1)

从注释中删除@ORM\JoinColumn(name="id", referencedColumnName="id_article") - doctrine会将您的关联映射到具有合理默认值的MySQL。

删除后,重新生成SQL:doctrine:schema:update --force

此外,如果您循环阅读文章以获取步骤,则最好在存储库中编写自定义方法,否则每次调用->getSteps()时,Doctrine都会进行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

中整理了一些最佳做法

答案 1 :(得分: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();