【发布时间】: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 上
-
请发布错误信息。
-
请发布您的文章和联系实体源代码。