首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内连接与SF2中的“SF2”原则

内连接与SF2中的“SF2”原则
EN

Stack Overflow用户
提问于 2015-01-07 14:41:01
回答 2查看 5.4K关注 0票数 1

我在用CreateQueryBuilder创建一个SQL查询时遇到了问题。

我有两张桌子:

  • 带字段的文章articleID (PK), tag, created, userID (FK)
  • 带字段的articlelocale表:articlelocaleID (PK), articleID (FK), title, body, locale, translated

在我的articlelocale表中,我有一个链接到我的文章表的FK。

现在,我想选择文章开头的文章,在这里,locale == .(来自articlelocale表)

这是我的开始,但我搞不懂:

代码语言:javascript
复制
$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');

我越试越犯错误..。。我做错了什么?

更新:

谢谢你的帮助!我把这个添加到我的文章实体中:

代码语言:javascript
复制
/**
 * @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之间的关系:

代码语言:javascript
复制
/**
 * @var \DX\MurisBundle\Entity\Article
 *
 * @ORM\ManyToOne(targetEntity="DX\MurisBundle\Entity\Article")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="articleID", referencedColumnName="articleID")
 * })
 */
private $articleid;

这是我的ArticleRepository中的查询:

代码语言:javascript
复制
$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时:

代码语言:javascript
复制
$articles = $em->getRepository('MurisBundle:Article')->getLatestArticles(null, $locale);

foreach($articles as $article)
{
    dump($article->getArticlelocale()); die;
}

结果是一个PersistentCollection..。

我想要一个实际的Articlelocale对象。我做错了什么?

这并不是一个大问题,但我也得到NL和EN,但我过滤‘地方== nl’。但我还是得到了两个结果。

EN

回答 2

Stack Overflow用户

发布于 2015-01-07 15:04:40

在处理理论时,不能直接使用表列名,您必须编写DQL --它与SQL的区别--您使用了在实体中定义的属性名称,而且联接部分应该具有指向第二个实体的属性,然后可以将查询创建为

代码语言:javascript
复制
$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实体有一个关系,类似于

代码语言:javascript
复制
/**
 * @ORM\OneToMany(targetEntity="\Namespace\YourBundle\Entity\Articlelocale", mappedBy="article", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
 */
protected $articlelocale;

您的Articlelocale实体应该指向Article实体,如下所示

代码语言:javascript
复制
/**
 * @var \Namespace\YourBundle\Entity\Article
 *
 * @ORM\ManyToOne(targetEntity="Namespace\YourBundle\Entity\Article")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="articleID", referencedColumnName="articleID")
 * })
 */
protected $article;

还为上述属性生成setter和setter。

编辑另一种方式将查询重写为

代码语言:javascript
复制
$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();
票数 1
EN

Stack Overflow用户

发布于 2015-01-07 15:07:30

在ArticleRepository中:

代码语言:javascript
复制
$query = $this->createQueryBuilder('a')
    ->select('a')
    ->innerJoin('a.articlesLocale', 'al')
    ->where('al.articleLocaleId = :localeId')
    ->setParameter('localeId', $locale)
    ->addOrderBy('a.created', 'DESC');

你的实体应该看起来像:

代码语言:javascript
复制
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;
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27821879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档