我在用CreateQueryBuilder创建SQL查询时遇到问题。
我有两张桌子:
带字段的表格文章:articleID (PK), tag, created, userID (FK)
表articlelocale包含字段:articlelocaleID (PK), articleID (FK), title, body, locale, translated
在我的article locale表中,有一个链接到我的article表的FK。
现在我想从项目表中选择项目,其中locale==。。。(来自articlelocale表)。
这是我的开始,但我想不通:
$a = $this->createQueryBuilder('a')
->select('a')
->innerJoin('a.articleid', 'ai', 'WITH', 'ai.articleid = :articleid')
->where('ai.locale = :locale')
->setParameter('locale', $locale)
->addOrderBy('a.created', 'DESC');
我越努力,我得到的错误就越多。。。我做错什么了?
更新:
谢谢你的帮助!我已将此添加到我的文章实体:
/**
* @ORM\OneToMany(targetEntity="DX\MurisBundle\Entity\Articlelocale", mappedBy="articleid", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
*/
protected $articlelocale;
/**
* Set articlelocale
*
* @param \DX\MurisBundle\Entity\Articlelocale $articlelocale
* @return Articlelocale
*/
public function setArticlelocale(\DX\MurisBundle\Entity\Articlelocale $articlelocale = null)
{
$this->articlelocale = $articlelocale;
return $this;
}
/**
* Get articlelocale
*
* @return \DX\MurisBundle\Entity\Articlelocale
*/
public function getArticlelocale()
{
return $this->articlelocale;
}
这是我的Articlelocale实体中
Article<->ArticleLocale
之间的关系:/**
* @var \DX\MurisBundle\Entity\Article
*
* @ORM\ManyToOne(targetEntity="DX\MurisBundle\Entity\Article")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="articleID", referencedColumnName="articleID")
* })
*/
private $articleid;
这是我的文章库中的查询:
$a = $this->createQueryBuilder('a')
->select('a')
->innerJoin('a.articlelocale', 'ai')
->where('ai.locale = :locale')
->setParameter('locale', $locale)
->addOrderBy('a.created', 'DESC');
if (false === is_null($limit))
$a->setMaxResults($limit);
return $a->getQuery()
->getResult();
我没有任何错误,但是当我想循环浏览我的文章并获得如下的文章区域设置时:
$articles = $em->getRepository('MurisBundle:Article')->getLatestArticles(null, $locale);
foreach($articles as $article)
{
dump($article->getArticlelocale()); die;
}
其结果是PersistentCollection。。。
我想要一个实际的Articlelocale对象。。我做错什么了?
这并不是什么大问题,但我也得到了NL和EN,但我过滤了“where locale==NL”。但我还是得到了两个结果。
最佳答案
在处理条令时不能直接使用表列名,必须编写DQL,它与SQL的不同之处在于,使用了在实体中定义的属性名,连接部分应该有指向第二个实体的属性,然后可以创建查询
$DM = $this->getDoctrine()->getManager();
$DM->createQueryBuilder('ar')
->select('ar')
->from('Namespace\YourBundle\Entity\Article','ar')
->innerJoin('ar.articlelocale', 'lo')
->where('lo.locale = :locale')
->setParameter(':locale', $locale)
->orderBy('ar.created', 'DESC');
在你的文章中,实体应该与
/**
* @ORM\OneToMany(targetEntity="\Namespace\YourBundle\Entity\Articlelocale", mappedBy="article", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
*/
protected $articlelocale;
您的
Articlelocale
实体应该指向Articlelocale
实体,如下所示/**
* @var \Namespace\YourBundle\Entity\Article
*
* @ORM\ManyToOne(targetEntity="Namespace\YourBundle\Entity\Article")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="articleID", referencedColumnName="articleID")
* })
*/
protected $article;
也为上述属性生成getter和setter
编辑另一种方法将查询重写为
$article= $this->getDoctrine()->getRepository('Namespace\YourBundle\Entity\Article');
$article->createQueryBuilder('ar')
->select('ar')
->innerJoin('ar.articlelocale', 'lo')
->where('lo.locale = :locale')
->setParameter(':locale', $locale)
->orderBy('ar.created', 'DESC')
->getQuery()
->getResult();
关于php - 在SF2中使用Doctrine“createQueryBuilder”进行内部联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27821879/