我有一个与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询问。
答案 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();
}
中整理了一些最佳做法
答案 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();