Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Symfony原则中使用QueryBuilder在两个实体之间进行无关系表连接_Php_Mysql_Sql_Symfony_Doctrine Orm - Fatal编程技术网

Php 如何在Symfony原则中使用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')

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

我的querybuilder:

    $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();