如何从学说中的联接表中检索结果

时间:2013-11-28 13:24:29

标签: php mysql symfony doctrine-orm

我正在使用当前symfony版本中捆绑的学说在两个表之间进行连接。这是我的控制器代码:

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Acme\GearDBBundle\Entity\TbGear;
use Acme\GearDBBundle\Entity\TbDships;

class DefaultController extends Controller
{
    public function indexAction()
    {
        $repository = $this->getDoctrine()
            ->getRepository('AcmeGearDBBundle:TbGear');
        $query = $repository->createQueryBuilder('p')
            ->select('p', 'q')
            ->innerJoin('p.fkShip', 'q', 'WITH', 'p.fkShip = q.id')
            ->getQuery();

        $result = $query->getResult();

        foreach ( $result as $p ) {
            $gear[] = array('shortname' => $p->getGearShortName(), 'name' => $p->getGearName(), 'shipname' => $p->getShipName /* Does not work, since the getter is in a different entity */);
        }

        return $this->render('AcmeGearDBBundle::index.html.twig', array('gear' => $gear));
    }
}

由此生成的查询是正确的,如果我在phpmyadmin中执行它,则会传递预期的字段。

SELECT t0_.GEAR_NAME AS GEAR_NAME0, t0_.GEAR_SHORT_NAME AS GEAR_SHORT_NAME1, t0_.STATUS AS STATUS2, t0_.ID AS ID3, t1_.SHIP_NAME AS SHIP_NAME4, t1_.CONTACT_NAME AS CONTACT_NAME5, t1_.CONTACT_EMAIL AS CONTACT_EMAIL6, t1_.ID AS ID7, t0_.FK_SHIP_ID AS FK_SHIP_ID8, t0_.FK_TYPE AS FK_TYPE9 
FROM tb_gear t0_ 
INNER JOIN tb_dships t1_ ON t0_.FK_SHIP_ID = t1_.ID 
AND (t0_.FK_SHIP_ID = t1_.ID)

但是,我不知道如何在返回的结果集中访问这些字段。我期望它工作的方式(通过访问连接表实体的getter)不起作用。错误消息显示为:FatalErrorException: Error: Call to undefined method Acme\GearDBBundle\Entity\TbGear::getShipName() in /var/www/symfony/src/Acme/GearDBBundle/Controller/DefaultController.php line 24 这是有道理的,因为TbGear实体没有名为getShipName()的getter方法,因为这是来自连接实体的方法。但是我如何访问这些值?这可能是一个愚蠢的问题,但我无法弄清楚。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

$p->getFkShip()->getShipName()也许?

这应该有效,因为它只会检索满足您关系的TbGear。所以你可以访问所有FkShip(我认为这是多对一的关系)应该只有一个,然后......你明白了!

修改

当然,我认为您已经正确设计了自己的课程,以便从TbGear获得一个getter来访问与FkShip的关系

答案 1 :(得分:0)

您可以添加该自定义getter:getShipName()吗?

public function getShipName(){
    if ( $this->ship != null ){
        return $this->ship->getName();
    }
    return null; // or an empty string
}