Php 如何在Symfony原则中使用QueryBuilder在两个实体之间进行无关系表连接
我有一个与实体类别相关的实体视频,我需要使用Doctrine QueryBuilder运行此SQL,这样我可以获得所有视频中使用最多的类别(1000+): 我的querybuilder:Php 如何在Symfony原则中使用QueryBuilder在两个实体之间进行无关系表连接,php,mysql,sql,symfony,doctrine-orm,Php,Mysql,Sql,Symfony,Doctrine Orm,我有一个与实体类别相关的实体视频,我需要使用Doctrine QueryBuilder运行此SQL,这样我可以获得所有视频中使用最多的类别(1000+): 我的querybuilder: $queryBuilder = $this->getEntityManager() ->createQueryBuilder() ->select('c') ->from('AcmeVideoBundle:Video', 'v')
$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
*
* @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查询?我错过了什么
信息:当我通过{field}查找时,persist、flush、clear在所有实体上运行良好,条令关系正常,我有一个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(如条令2)的主要原因之一
尝试:
本手册详细介绍了一些细节,但奇怪的是,它似乎没有一个连接示例。因此,人们普遍感到困惑
你可能不知道这一点,但联合国已经通过了一项决议,禁止在别名中使用缩写。为了安全起见,请尝试:
$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();
好的,解决了,问题是实体没有完全映射为多个双向关系 这些实体现在是:
class Video
{
/**
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="Acme\CategoryBundle\Entity\Category", inversedBy="video") // Note the inversedBy key
*/
private $category;
}
class Category
{
/**
* @var Video
*
* @ORM\ManyToMany(targetEntity="Acme\VideoBundle\Entity\Video", mappedBy="category") // Again the inversed
*/
private $video; // New field for bidirectional ManyToMany
}
最后一个正在工作的QueryBuilder(现在有完整的别名版本:p):
致以最诚挚的问候您是否尝试过像您在
连接时那样声明关系表
?是:[语义错误]第0行,第54列“video\u category”附近:错误:未定义类“video\u category”。我喜欢它别名的全名,我在StackOverflow中使用了简短版本以澄清示例,是很有名的有着相同观点的人!在过去的几个小时里,我在->选择()和->连接()/innerJoin()的其他组合中遇到了相同的异常:[语义错误]第0行,“选择类别”附近的列-1:错误:在不选择至少一个根实体别名的情况下,无法通过标识变量选择实体。我用了你的密码:/
$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();
class Video
{
/**
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="Acme\CategoryBundle\Entity\Category", inversedBy="video") // Note the inversedBy key
*/
private $category;
}
class Category
{
/**
* @var Video
*
* @ORM\ManyToMany(targetEntity="Acme\VideoBundle\Entity\Video", mappedBy="category") // Again the inversed
*/
private $video; // New field for bidirectional ManyToMany
}
$queryBuilder = $this->getEntityManager()
->createQueryBuilder()
->select('category')
->from('AcmeCategoryBundle:Category', 'category')
->join('category.video', 'video')
->groupBy('category.id')
->having('COUNT(video.id) > 1000')
->orderBy('category.name', 'ASC')
->getQuery();