0

我有一个与 Steps (OneToMany) 和 Steps 与 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 />";
    }

我不知道如何从表 Steps 中获取数据,使用表 Article 和使用 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 的询问更多。

4

2 回答 2

1

从您的注释中删除@ORM\JoinColumn(name="id", referencedColumnName="id_article")- 学说会将您的关联映射到具有合理默认值的 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(); 
}

我在一篇博文中汇总了一些最佳实践

于 2012-06-29T20:39:26.390 回答
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();

于 2012-06-29T14:29:43.350 回答