代码之家  ›  专栏  ›  技术社区  ›  manuerumx

获取结果QueryBuilder多个联接

  •  1
  • manuerumx  · 技术社区  · 10 年前

    我在从QueryBuilder获取结果时遇到了一些小问题。我正在使用Symfony 2。

    我的问题是当我试图从联接中获取数据时。a关系是可以的,但当我试图从B、C和D那里获得信息时。。。显然失败了。

    这些表格是

    用户 许多<->许多的 用户类型 许多<->许多的 类别用户类型 许多<->许多的 应用

    • 用户表包含用户信息
    • 应用程序具有应用程序信息
    • CatUsersType具有每个应用程序的用户类型
    • UsersType的id为User和UserType

    这是我的代码:

    $qb = $em->createQueryBuilder();
    $users  = $qb->select('a, b, c, d')
        ->from('MyBundle:users', 'a')
        ->innerJoin('MyBundle:userstype','b', 'WITH', 'b.iduser = a.id')
        ->innerJoin('MyBundle:catuserstype','c','WITH', 'c.id = b.idusertype')
        ->innerJoin('MyBundle:applications','d', 'WITH', 'd.id = c.idapp')
        ->where('d.id = :app_id')
        ->setParameter('app_id', $idapp)
        ->getQuery()
        ->getResult();
    if (count($users) > 0) {
        $i = 0;
        $elements = array('data' => array());
        foreach ($users as $usr) {
            $created = $usr->getCreated();//['date'];
            if($created instanceof \DateTime){
                $created = $created->format('Y-m-d H:i:s');
            }
            $tmp = [
                'username' => $usr->getUsername(),
                'name' => $usr->getName() . ' ' .$usr->getLastname(),
                'created'=> $created,
                'myField'=> $usr->getIdusertype(),    //Problems here
                'myApp' => $usr->getIdapp(),         //And here idApp comes from c or d tables
                'id' => $usr->getId()
            ];
            array_push($elements['data'], $tmp);
            $i++;
        }
        $response = $elements;
    }
    

    编辑:

    我得到了相同的结果,将innerJoin更改为leftJoin或rightJoin

    试图在类用户上调用方法“getIdusertype”,但该方法来自类用户类型

    我发现了问题。 这种关系是错误的。我会更正代码并共享正确的代码。感谢所有人

    1 回复  |  直到 10 年前
        1
  •  3
  •   SBH    10 年前

    问题是您尝试访问的财产 usertype catuserstype 直接从用户对象。第二个问题是,当前代码只适用于多对一关系,而不适用于多到多关系。如果你有不同的关系,代码可以是

    foreach ($users as $usr) {
        $created = $usr->getCreated();//['date'];
        if($created instanceof \DateTime){
            $created = $created->format('Y-m-d H:i:s');
        }
        $tmp = [
            'username' => $usr->getUsername(),
            'name' => $usr->getName() . ' ' .$usr->getLastname(),
            'created'=> $created,
            'myField'=> $usr->getUsertype()->getIdusertype(),
            'myApp' => $usr->getUsertype()->getCatuserstype()->getIdapp(),
            'id' => $usr->getId()
        ];
        array_push($elements['data'], $tmp);
        $i++;
    }
    

    但多对多更像

    foreach ($users as $usr) {
        $created = $usr->getCreated();//['date'];
        if($created instanceof \DateTime){
            $created = $created->format('Y-m-d H:i:s');
        }
        foreach ($usr->getUsertype as $usertype) {
            foreach ($usertype->getCatuserstype() as $catuserstype) {
                $tmp = [
                    'username' => $usr->getUsername(),
                    'name'     => $usr->getName() . ' ' .$usr->getLastname(),
                    'created'  => $created,
                    'myField'  => $usertype->getIdusertype(),
                    'myApp'    => $catuserstype->getIdapp(),
                    'id'       => $usr->getId()
                ];
            }
        }
        array_push($elements['data'], $tmp);
        $i++;
    }
    

    或者用其他方式结合你的 $elements['data'] 大堆

    编辑:

    我在回答中假设,实体之间存在适当的关系。因此,您可以像这样编写查询

    $users  = $qb->select('a')
        ->from('MyBundle:users', 'a')
        ->innerJoin('a.userstype', 'b')
        ->innerJoin('b.catuserstype', 'c')
        ->innerJoin('c.applications', 'd')
        ->where('d.id = :app_id')
        ->setParameter('app_id', $idapp)
        ->getQuery()
        ->getResult();