【问题标题】:Doctrine: Many to many query gives incomplete results原则:多对多查询给出不完整的结果
【发布时间】:2018-01-19 19:27:26
【问题描述】:

好的,我得到了三个表'articles'、'tags'和'articles_tags',前两者之间是多对多的关系。

现在我正在尝试查询“查找所有带有 ID 3 标签的文章”

我一直在尝试这个:

$query = $em
            ->createQueryBuilder()
            ->select("a", "t")
            ->from("Models\Article", "a")
            ->leftJoin("a.tags", "t")
            ->where("t.id = :tagid")
            ->setParameter("tagid", $_GET['id'])
            ->getQuery();
$articles = $query->getResult();

确实可以找到正确的文章,但这些文章现在只显示为具有一个标签,即使它们有更多标签。

我觉得我在某个地方犯了一个愚蠢的错误,或者可能选择了完全错误的方法,但我一直盯着它,似乎找不到它。

【问题讨论】:

  • 我建议您只选择查询中的文章实体,然后使用实体关系访问标签(类似于$article->getTags()
  • 是的,但是我必须在文章数组上做一个foreach,并且只过滤掉我需要的那些。如果我在数据库中只有 10 个实体而不是更多,那很好。还是我以某种方式误解了这一点?

标签: php doctrine-orm


【解决方案1】:

不是最漂亮的

$query = $em
            ->createQueryBuilder()
            ->select("a")
            ->from("Models\Article", "a")
            ->join("a.tags", "t")
            ->where("t.id = :tagid")
            ->setParameter("tagid", $_GET['id'])
            ->getQuery();
$articles = $query->getResult();

// Because IN clause throw an exception with empty array
if(count(articles) === 0) {
   return [];
}

$query = $em
            ->createQueryBuilder()
            ->select("a")
            ->from("Models\Article", "a")
            ->where("a.id IN (:articles)")
            ->setParameter("articles", $articles)
            ->getQuery();
return $query->getResult();

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多