Mysql 为什么此联接查询不能与createQueryBuilder一起使用?

Mysql 为什么此联接查询不能与createQueryBuilder一起使用?,mysql,doctrine,silex,Mysql,Doctrine,Silex,这个很好用 SELECT * FROM podcasttags INNER JOIN podcast ON podcasttags.podcastid = podcast.id INNER JOIN tag ON podcasttags.tagid = tag.id 但当我尝试使用doctrine1 createQueryBuilder时,我得到一个错误: $queryBuilder = $this->db->createQueryBuilder()

这个很好用

SELECT * FROM podcasttags
INNER JOIN podcast
ON podcasttags.podcastid = podcast.id
INNER JOIN tag
ON podcasttags.tagid = tag.id  
但当我尝试使用doctrine1 createQueryBuilder时,我得到一个错误:

$queryBuilder = $this->db->createQueryBuilder()
                ->select('pt')
                ->from('podcasttags', 'pt')
                ->innerJoin('podcast p ON pt.podcastid = p.id')
                ->innerJoin('tag t ON pt.tagid = t.id');
$statement = $queryBuilder->execute();
$podcastData = $statement->fetchAll();
警告:缺少的参数2 条令\DBAL\Query\QueryBuilder::innerJoin(),在中调用 C:\xampp\htdocs\FDRPodcast\src\FDRPodcast\Repository\PodcastRepository.php 第49行,并在中定义 C:\xampp\htdocs\FDRPodcast\vendor\doctor\dbal\lib\doctor\dbal\Query\QueryBuilder.php 在线601

警告:缺少的参数3 条令\DBAL\Query\QueryBuilder::innerJoin(),在中调用 C:\xampp\htdocs\FDRPodcast\src\FDRPodcast\Repository\PodcastRepository.php 第49行,并在中定义 C:\xampp\htdocs\FDRPodcast\vendor\doctor\dbal\lib\doctor\dbal\Query\QueryBuilder.php 在线601

注意:未定义变量:join C:\xampp\htdocs\FDRPodcast\vendor\doctor\dbal\lib\doctor\dbal\Query\QueryBuilder.php 在线606

注意:未定义变量:中的别名 C:\xampp\htdocs\FDRPodcast\vendor\doctor\dbal\lib\doctor\dbal\Query\QueryBuilder.php 在线607

警告:缺少的参数2 条令\DBAL\Query\QueryBuilder::innerJoin(),在中调用 C:\xampp\htdocs\FDRPodcast\src\FDRPodcast\Repository\PodcastRepository.php 第50行,并在中定义 C:\xampp\htdocs\FDRPodcast\vendor\doctor\dbal\lib\doctor\dbal\Query\QueryBuilder.php 在线601

警告:缺少的参数3 条令\DBAL\Query\QueryBuilder::innerJoin(),在中调用 C:\xampp\htdocs\FDRPodcast\src\FDRPodcast\Repository\PodcastRepository.php 第50行,并在中定义 C:\xampp\htdocs\FDRPodcast\vendor\doctor\dbal\lib\doctor\dbal\Query\QueryBuilder.php 在线601


《条令手册》中的一个例子:

$q = Doctrine_Query::create()
    ->select('u.id')
    ->from('User u')
    ->leftJoin('u.Groups g')
    ->innerJoin('u.Phonenumbers p')
    ->leftJoin('u.Email e');
因此,您的查询应该如下所示:

$queryBuilder = $this->db->createQueryBuilder()
            ->select('pt')
            ->from('podcasttags pt')
            ->innerJoin('pt.podcast p')
            ->innerJoin('pt.tag t');

它接着说,“pt.tagid=t.id”之类的东西是不必要的,因为默认情况下,条令关联主键。希望这有帮助。

这里的问题是您缺少QueryBuilder的innerJoin方法中的一些参数。
您以错误的方式调用该方法

->innerJoin('podcast p ON pt.podcastid = p.id')
innerJoin方法需要四个参数

  • 来自表的源的别名
  • 联接表
  • 联接表的别名
  • 连接条件
  • 工作查询

    SELECT * FROM podcasttags
    INNER JOIN podcast
    ON podcasttags.podcastid = podcast.id
    INNER JOIN tag
    ON podcasttags.tagid = tag.id  
    
    有了原则,DBAL将是

    $queryBuilder = $this->db->createQueryBuilder()
             ->select('*')
             ->from('podcasttags', 'pt')
             ->innerJoin('pt', 'podcast', 'p', 'pt.podcastid = p.id')
             ->innerJoin('pt', 'tag', 't', 'pt.tagid = t.id');
    

    最后值得注意的是,如果调用QueryBuilder->getSQL()的方法,它将输出使用QueryBuilder对象形成的当前查询。

    Refer-doctrine与实体一起工作,而不是直接与表一起工作,而off-course innerjoin()调用是错误的。第一个代码块用于doctrine 1,第二个代码块用于doctrine 2。