我正在使用当前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方法,因为这是来自联接实体的方法。但是,如何访问这些值?这可能是一个愚蠢的问题,但我无法弄清楚。任何帮助表示赞赏。 最佳答案
$p->getFkShip()->getShipName()
也许?
这应该起作用,因为它将仅检索满足您关系的TbGear
。这样您就可以访问应该只是一个的所有FkShip
(我想这是多对一的关系),然后.....就可以了!
编辑
当然,我想您已经正确地设计了类,以便您可以从TbGear
中使用getter来访问与FkShip
的关系。