【发布时间】:2014-02-02 16:35:15
【问题描述】:
我有一个与实体类别相关的实体视频,我需要使用 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...
}
我怎样才能使用关系表来运行与学说Querybuilder的原始SQL查询?我错过了什么?
INFO:当我 findBy{field}、persist、flush、clear 在所有实体上工作正常时,Doctrine 关系正常,我有一个 Video、Category 和 video_category 表正常,原始 SQL 查询工作正常。
【问题讨论】:
-
您是否尝试像使用
JOIN一样声明关系表? -
是的:[语义错误]第 0 行,'video_category' 附近的第 54 列:错误:未定义类'video_category'。
标签: php mysql sql symfony doctrine-orm