【问题标题】:Transform SQL to DQL将 SQL 转换为 DQL
【发布时间】:2021-12-17 04:29:04
【问题描述】:

我尝试将 SQL 函数转换为 DQL,但总是出错...

我有 3 张桌子

/**
 * @ORM\Entity(repositoryClass=ArticleRepository::class)
 */
class Article
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $title;

    /**
     * @Gedmo\Slug(fields={"title"})
     * @ORM\Column(type="string", length=255, unique=true, nullable=true)
     */
    private $slug;

   /**
     * @ORM\Column(type="boolean", options={"default":"0"})
     */
    private $isItalian = false;

    /**
     * @ORM\Column(type="text")
     */
    private $content;

    /**
     * @ORM\ManyToMany(targetEntity=Contact::class, inversedBy="viewedArticles")
     */
    private $contact;
}
class Contact implements UserInterface, JsonSerializable
{

    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    protected ?int $id = null;

    /**
     * @ORM\Column(type="string", length=255, unique=true)
     */
    protected ?string $email = null;


    /**
     * @ORM\ManyToMany(targetEntity=Article::class, mappedBy="contact")
     */
    private $viewedArticles;
}

还有一个多对多表 带有article_id 和contact_id 的article_contact(一个manyToMany 表)

我想获取所有不在 article_contact 表中的文章(这是所有联系人未查看的文章)

我在 SQL 中尝试了这个请求,它可以工作,但是它返回一个数组,我需要返回一个对象才能在 Symfony 中使用它

$conn = $entityManager->getConnection();
        $sql = 'SELECT * 
                FROM article
                LEFT JOIN article_contact 
                ON article.id = article_id
                AND contact_id = '.$id.'
                WHERE article.is_italian = '.$isItalian.'
                AND article_id IS NULL';

        $stmt = $conn->prepare($sql);
        $result = $stmt->executeQuery();
        return $result->fetchAllAssociative();

DQL 请求:

return $this->createQueryBuilder('a')
            ->leftJoin('a.contact', 'contact')
            ->where('a.isItalian = 0')
            ->andWhere('contact = 1')
            ->andWhere('contact.viewedArticles IS NULL')
            ->getQuery()
            ->getResult()
        ;

这是 ->andWhere('contact.viewedArticles IS NULL') 部分不起作用,我有这个错误

[语义错误] 第 0 行,第 113 列靠近 'viewedArticles':错误:无效的 PathExpression。需要 StateFieldPathExpression 或 SingleValuedAssociationField。

【问题讨论】:

  • LEFT JOIN article_contact ac 用作别名
  • 但我总是有错误,这些错误是什么?你的实体类是什么?
  • 我尝试了一些 DQL,但我没有想要的结果,唯一“有效”的是当我在我的存储库中使用 SQL 时,就像我在我的帖子中使用的示例一样:/ i' m 在 ArticleRepository 上
  • 请发布错误信息。
  • 请发布您的文章和联系实体源代码。

标签: sql symfony doctrine dql


【解决方案1】:

答案是

$qb->select('a')
            ->from(Article::class,'a')
            ->leftJoin('a.contact', 'contact', 'WITH', 'contact.id = :id')
            ->setParameter('id', $contactId)
            ->andWhere('a.isItalian = :isItalian')
            ->setParameter('isItalian', $isItalian)
            ->groupBy('a.id')
            ->having('COUNT(contact.id) = 0')
        ;

        return $qb->getQuery()->getResult();

感谢威尔 B。!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多