gpt4 book ai didi

php - 如何在 2 个实体之间使用 QueryBuilder 在 Symfony Doctrine 中没有关系表的情况下加入

转载 作者:可可西里 更新时间:2023-11-01 06:39:57 26 4
gpt4 key购买 nike

我有一个与实体类别相关的实体视频,我需要使用 Doctrine QueryBuilder 运行此 SQL,这样我可以获得所有视频中最常用的类别 (1000+):

    SELECT c.*
FROM Video v
INNER JOIN video_category vc ON vc.video_id = v.id
INNER JOIN Category c ON vc.category_id = c.id
GROUP BY c.id
HAVING COUNT(v.id) > 1000
ORDER BY c.name ASC;

我的查询生成器:

    $queryBuilder = $this->getEntityManager()
->createQueryBuilder()
->select('c')
->from('AcmeVideoBundle:Video', 'v')
// Can Doctrine join itself silently with relational info in the Entities?
->join('AcmeCategoryBundle:Category', 'c', Expr\Join::WITH, 'v.id = c.id')
->groupBy('c.id')
->having('COUNT(v.id) > 1000')
->orderBy('c.name', 'ASC')
->getQuery();

但是queryBuilder输出的SQL查询是这样的:

    SELECT c0_.id AS id0, c0_.NAME AS name1 
FROM Video v1_
INNER JOIN Category c0_ ON (v1_.id = c0_.id)
GROUP BY c0_.id
HAVING COUNT(v1_.id) > 1000
ORDER BY c0_.NAME ASC

没有关系表(video_category)

实体映射:

    /**
* Video
*
* @ORM\Table
* @ORM\Entity(repositoryClass="Acme\VideoBundle\Entity\VideoRepository")
*/
class Video
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\ManyToMany(targetEntity="Acme\CategoryBundle\Entity\Category", cascade={"persist"})
*/
private $category;

// More fields, getters and setters etc...
}

/**
* Category
*
* @ORM\Table
* @ORM\Entity(repositoryClass="Acme\CategoryBundle\Entity\CategoryRepository")
*/
class Category
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

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

// More fields, getters and setters etc...
}

如何使用关系表通过 doctrine Querybuilder 运行原始 SQL 查询?我错过了什么?

信息:当我在所有实体上 findBy{field}、persist、flush、clear 时工作正常,Doctrine 关系正常,我有 Video、Category 和 video_category 表正常,原始 SQL 查询工作完美。

最佳答案

   // Can Doctrine join itself silently with relational info in the Entities?
->join('AcmeCategoryBundle:Category', 'c', Expr\Join::WITH, 'v.id = c.id')

是的!事实上,这是使用 ORM(例如 Doctrine 2)的主要原因之一。

尝试:

->leftJoin('v.category','c')

虽然奇怪的是似乎没有连接示例,但该手册有更多详细信息。因此,常见的混淆。

http://docs.doctrine-project.org/en/latest/reference/query-builder.html

您可能还没有意识到,联合国已经通过了一项决议,禁止对别名使用缩写。为了安全起见,请尝试:

$queryBuilder = $this->getEntityManager()
->createQueryBuilder()
->addSelect('category')
->from('AcmeVideoBundle:Video', 'video')
->leftJoin('video.category', 'category')
->groupBy('category.id')
->having('COUNT(video.id) > 1000')
->orderBy('category.name', 'ASC')
->getQuery();

关于php - 如何在 2 个实体之间使用 QueryBuilder 在 Symfony Doctrine 中没有关系表的情况下加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21513086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com