【问题标题】:Why is this join query not working with createQueryBuilder?为什么此连接查询不适用于 createQueryBuilder?
【发布时间】:2013-12-10 16:06:29
【问题描述】:

这很好用

SELECT * FROM podcasttags
INNER JOIN podcast
ON podcasttags.podcastid = podcast.id
INNER JOIN tag
ON podcasttags.tagid = tag.id  

但是当我尝试使用教义1 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 Doctrine\DBAL\Query\QueryBuilder::innerJoin(),调用 C:\xampp\htdocs\FDRPodcast\src\FDRPodcast\Repository\PodcastRepository.php 在第 49 行并定义在 C:\xampp\htdocs\FDRPodcast\vendor\doctrine\dbal\lib\Doctrine\DBAL\Query\QueryBuilder.php 在第 601 行

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

注意:未定义的变量:加入 C:\xampp\htdocs\FDRPodcast\vendor\doctrine\dbal\lib\Doctrine\DBAL\Query\QueryBuilder.php 在第 606 行

注意:未定义的变量:别名 C:\xampp\htdocs\FDRPodcast\vendor\doctrine\dbal\lib\Doctrine\DBAL\Query\QueryBuilder.php 在第 607 行

警告:缺少参数 2 Doctrine\DBAL\Query\QueryBuilder::innerJoin(),调用 C:\xampp\htdocs\FDRPodcast\src\FDRPodcast\Repository\PodcastRepository.php 在第 50 行并在 C:\xampp\htdocs\FDRPodcast\vendor\doctrine\dbal\lib\Doctrine\DBAL\Query\QueryBuilder.php 在第 601 行

警告:缺少参数 3 Doctrine\DBAL\Query\QueryBuilder::innerJoin(),调用 C:\xampp\htdocs\FDRPodcast\src\FDRPodcast\Repository\PodcastRepository.php 在第 50 行并在 C:\xampp\htdocs\FDRPodcast\vendor\doctrine\dbal\lib\Doctrine\DBAL\Query\QueryBuilder.php 在第 601 行

【问题讨论】:

  • 参考doctrine manual 学说适用于不直接使用表的实体,并且偏离路线的 innerjoin() 调用是错误的

标签: mysql doctrine silex


【解决方案1】:

Doctrine 手册中的一个例子:

$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”这样的东西是不必要的,因为 Doctrine 默认关联主键。希望这会有所帮助。

【讨论】:

  • 您的第一个代码块用于原则 1,第二个代码块用于原则 2。
【解决方案2】:

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

->innerJoin('podcast p ON pt.podcastid = p.id')

innerJoin 方法需要四个参数

  1. from 表的别名
  2. 连接表
  3. 连接表的别名
  4. 加盟条件

工作查询

SELECT * FROM podcasttags
INNER JOIN podcast
ON podcasttags.podcastid = podcast.id
INNER JOIN tag
ON podcasttags.tagid = tag.id  

使用 Doctrine 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 对象形成的当前查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2019-12-05
    • 2020-05-12
    • 2020-08-18
    相关资源
    最近更新 更多