【问题标题】:get children from many-to-many self-referenced entity in doctrine从教义中的多对多自引用实体中获取孩子
【发布时间】:2021-11-14 04:14:56
【问题描述】:

我有一个实体文章是自引用的。

Article {
    
    //primary key
    private $id;

    //unique
    private $slug;

    /**
     * @ORM\ManyToMany(targetEntity=self::class, inversedBy="parents")
     * @ORM\JoinTable(
     *     name = "article_article",
     *     joinColumns = {@ORM\JoinColumn(name = "article_source", referencedColumnName = "id")},
     *     inverseJoinColumns = {@ORM\JoinColumn(name = "article_target", referencedColumnName = "id")}
     * )
     */

    private ?Collection $children;

    /**
     * @ORM\ManyToMany(targetEntity=self::class, mappedBy="children")
     */
    private ?Collection $parents;
}

我从请求中获取文章 slug,我需要获取此 slug 的所有相关文章。 我正在尝试用 dql 做到这一点,但即使是简单的查询

$queryBuilder = $this->createQueryBuilder('a');
        $queryBuilder->where('a.children = 1');

给我

错误:无效的路径表达式。需要 StateFieldPathExpression 或 SingleValuedAssociationField。”

所以我需要这个 sql

select a.slug from article a where a.id in (
    select aa.article_target from article a2 inner join article_article aa on a2.id = aa.article_source
        where a2.slug = 'article_slug'
    )

翻译成dql,有人可以帮我吗? 以及如何从 dql 寻址到 table article_article?

附言这个变种工作,但不适合我,由于某些原因,我需要 dql

$article = $repository->findOneBy($criteria);
$children = $article->getChildren();

【问题讨论】:

    标签: sql symfony doctrine-orm doctrine dql


    【解决方案1】:

    在 Doctrine 查询构建器中,您使用实体(PHP 类值)作为参数。您想在父母/孩子的Collection 中查找具有特定Article 的文章。您想使用MEMBER OF 运算符。

    存储库:

      public function findOneBySlug($slug): ?Article
      {
        return $this->createQueryBuilder('a')
                    ->andWhere('a.slug = :val')
                    ->setParameter('val', $slug)
                    ->getQuery()
                    ->getOneOrNullResult()
          ;
      }
    
      public function findChildrenOf(Article $article)
      {
        return $this->createQueryBuilder('a')
                    ->where(':art MEMBER OF a.parents')
                    ->setParameter('art', $article)
                    ->getQuery()
                    ->getResult()
          ;
      }
    
      public function findParentsOf(Article $article)
      {
        return $this->createQueryBuilder('a')
                    ->where(':art MEMBER OF a.children')
                    ->setParameter('art', $article)
                    ->getQuery()
                    ->getResult()
          ;
      }
    

    控制器:

    $article = $repository->findOneBySlug($slug);
    $children = $repository->findChildrenOf($article);
    $parents = $repository->findParentsOf($article);
    

    Doctrine 将自动确定它需要查询的字段和表,并为配置的数据库构建查询。

    【讨论】:

    • 感谢很多朋友!我不知道成员。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多