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

时间:2013-11-25 19:20:56

标签: 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('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 \库\ PodcastRepository.php   在第49行并在中定义   C:\ XAMPP \ htdocs中\ FDRPodcast \供应商\原则\ DBAL \ LIB \原则\ DBAL \查询\ QueryBuilder.php   在第601行

     

警告:缺少参数3   调用的是Doctrine \ DBAL \ Query \ QueryBuilder :: innerJoin()   C:\ XAMPP \ htdocs中\ FDRPodcast的\ src \ FDRPodcast \库\ PodcastRepository.php   在第49行并在中定义   C:\ XAMPP \ htdocs中\ FDRPodcast \供应商\原则\ DBAL \ LIB \原则\ DBAL \查询\ QueryBuilder.php   在第601行

     

注意:未定义的变量:加入   C:\ XAMPP \ htdocs中\ FDRPodcast \供应商\原则\ DBAL \ LIB \原则\ DBAL \查询\ QueryBuilder.php   在第606行

     

注意:未定义的变量:别名in   C:\ XAMPP \ htdocs中\ FDRPodcast \供应商\原则\ DBAL \ LIB \原则\ DBAL \查询\ QueryBuilder.php   在第607行

     

警告:缺少参数2   调用的是Doctrine \ DBAL \ Query \ QueryBuilder :: innerJoin()   C:\ XAMPP \ htdocs中\ FDRPodcast的\ src \ FDRPodcast \库\ PodcastRepository.php   在第50行并在中定义   C:\ XAMPP \ htdocs中\ FDRPodcast \供应商\原则\ DBAL \ LIB \原则\ DBAL \查询\ QueryBuilder.php   在第601行

     

警告:缺少参数3   调用的是Doctrine \ DBAL \ Query \ QueryBuilder :: innerJoin()   C:\ XAMPP \ htdocs中\ FDRPodcast的\ src \ FDRPodcast \库\ PodcastRepository.php   在第50行并在中定义   C:\ XAMPP \ htdocs中\ FDRPodcast \供应商\原则\ DBAL \ LIB \原则\ DBAL \查询\ QueryBuilder.php   在第601行

2 个答案:

答案 0 :(得分: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 :(得分:0)

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

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

方法innerJoin需要四个参数

  1. 来自表格的别名
  2. 联接表
  3. 联接表的别名
  4. 加入条件
  5. 工作查询

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