我在用CreateQueryBuilder创建一个SQL查询时遇到了问题。
我有两张桌子:
articleID (PK), tag, created, userID (FK)articlelocaleID (PK), articleID (FK), title, body, locale, translated在我的articlelocale表中,我有一个链接到我的文章表的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;这是我的ArticleRepository中的查询:
$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();我没有遇到任何错误,但是当我想循环我的文章并得到这样的ArticleLocale时:
$articles = $em->getRepository('MurisBundle:Article')->getLatestArticles(null, $locale);
foreach($articles as $article)
{
dump($article->getArticlelocale()); die;
}结果是一个PersistentCollection..。

我想要一个实际的Articlelocale对象。我做错了什么?
这并不是一个大问题,但我也得到NL和EN,但我过滤‘地方== nl’。但我还是得到了两个结果。
发布于 2015-01-07 15:04:40
在处理理论时,不能直接使用表列名,您必须编写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');在您的文章中,实体应该与Articlelocale实体有一个关系,类似于
/**
* @ORM\OneToMany(targetEntity="\Namespace\YourBundle\Entity\Articlelocale", mappedBy="article", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
*/
protected $articlelocale;您的Articlelocale实体应该指向Article实体,如下所示
/**
* @var \Namespace\YourBundle\Entity\Article
*
* @ORM\ManyToOne(targetEntity="Namespace\YourBundle\Entity\Article")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="articleID", referencedColumnName="articleID")
* })
*/
protected $article;还为上述属性生成setter和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();发布于 2015-01-07 15:07:30
在ArticleRepository中:
$query = $this->createQueryBuilder('a')
->select('a')
->innerJoin('a.articlesLocale', 'al')
->where('al.articleLocaleId = :localeId')
->setParameter('localeId', $locale)
->addOrderBy('a.created', 'DESC');你的实体应该看起来像:
class Article
{
private $articleId;
/**
* @var Article
*
* @ORM\OneToMany(targetEntity="path\to\ArticleLocale", mappedBy="article")
*/
private $articlesLocale;
/**
* @return integer
*/
public function getArticleId()
{
return $this->articleId;
}
/**
* @return ArticleLocale
*/
public function getLocale(){
return $this->locale;
}
/**
* @param ArticleLocale $locale
*/
public function setLocale($locale){
return $this->locale = $locale;
}
}
class ArticleLocale
{
private $articleLocaleId;
/**
* @var ArticleLocale
*
* @ORM\ManyToOne(targetEntity="path\to\Article", inversedBy="articlesLocale")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="article_id", referencedColumnName="articleId", nullable=false)
* })
*/
private $article;
/**
* @return integer
*/
public function getArticleLocaleId()
{
return $this->articleLocaleId;
}
/**
* @return Article
*/
public function getArticles(){
return $this->articles;
}
}https://stackoverflow.com/questions/27821879
复制相似问题