我是Symfony2的新手,并开发了我的第一个项目
我想为每个" ejuridique" ejuridique的名字和他的第一个项目的第一张照片。
但是,目前,我收到错误"未定义的索引:chl \ websitesBundle \ photo"当我从控制器调用我自己的函数时,有2个级联左连接。
twig" liste.html.twig"
{% for ejuridique in ejuridiques %}
<div>
<div>{{ejuridique.nom}} </div>
<div>
{% for projet in ejuridique.projets %}
{% for photo in projet.photos %}
{{photo.name}}
{%endfor%}
{%endfor%}
</div>
<div>
{%endfor%}
控制器
class websitesController extends Controller
{
public function listeAction($page)
{
$em = $this ->getDoctrine()
->getManager();
$ejuridiques = $em ->getRepository('chlwebsitesBundle:Ejuridique')
->findAll();
$projets = $em ->getRepository('chlwebsitesBundle:Ejuridique')
->myFindAll();
return $this->render('chlwebsitesBundle:websites:liste.html.twig', array(
'ejuridiques'=>$ejuridiques,'projets'=>$projets));
ejuridique存储库
class ejuridiqueRepository extends EntityRepository
{
public function myFindAll()
{
$qb = $this->createQueryBuilder('a')
->leftjoin('a.projets', 'pr' )
->leftjoin('pr.photos', 'ph' )
->where('pr.projetPosition = :position_pr')
->ANDwhere('ph.position = :position_ph')
->setParameters(array('position_pr'=> "1",'position_ph'=> "1"))
->addSelect('pr')
->addSelect('ph');
return $qb->getQuery()
->getResult();
}
}
我的3个实体
ejuridique
class ejuridique
{
/**
* @ORM\OneToMany(targetEntity="chl\websitesBundle\Entity\Projet", mappedBy="ejuridique")
* @ORM\JoinColumn(nullable=false)
*/
private $projets;
·PROJET
class projet
{
/**
* @ORM\ManyToOne(targetEntity="chl\websitesBundle\Entity\ejuridique", inversedBy="projets")
*/
private $ejuridique;
/**
* @var integer
*
* @ORM\Column(name="projet_position", type="integer")
*/
private $projetPosition;
/**
* @ORM\OneToMany(targetEntity="chl\websitesBundle\Entity\Photo", mappedBy="projet")
* @ORM\JoinColumn(nullable=false)
*/
private $photos;
照片
class photo
{
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @ORM\ManyToOne(targetEntity="chl\websitesBundle\Entity\projet", inversedBy="photos")
*/
private $projet;
/**
* @var integer
*
* @ORM\Column(name="position", type="integer")
*/
private $position;
}
所以,对于所有这些文件,我暂时收到错误&#34; ContectErrorException:注意:未定义索引:chl \ websitesBundle \ Entity \ Photo&#34;但
当我从控制器中拨打一个简单的&#34; findall()&#34;在我的ejuridique存储库中,我得到了所有项目和所有图片的所有ejuridique。因此,我认为我的实体和我的数据库一切正常。
当我调用我的函数&#34; myFindAll&#34;只有1个左连接在&#34; ejuridique&#34;和#34; projet&#34;带参数。一切都运转正常。
只有当我在自己的功能中有2个级联的左连接时才会出现这种情况&#34; myFindAll&#34;我收到此错误
我希望我的问题很明确,并且我已经提供了所有必要的信息。
提前感谢您的帮助。
答案 0 :(得分:0)
只需将其更改为您的控制器:
public function listeAction($page)
{
$em = $this->getDoctrine()->getManager();
$ejuridiques = $em->getRepository('chlwebsitesBundle:Ejuridique')
->myFindAll();
return $this->render('chlwebsitesBundle:websites:liste.html.twig', array(
'ejuridiques' => $ejuridiques));
}
你只需要一个请求即可获得所有这些信息:)但是你所做的事情即使你做了额外无用的事情也应该有效......
我不知道它是否会改变任何东西,但通常,当我编写查询时,我会这样做:
$qb = $this->createQueryBuilder('a')
->leftjoin('a.projets', 'pr' )
->addSelect('pr')
->leftjoin('pr.photos', 'ph' )
->addSelect('ph');
// ...
答案 1 :(得分:0)
我认为你混淆了一些事情(或者我并没有真正明白你要做的事情:-D)。
------ 1 ---------
执行此操作时:
$projets = $em->getRepository('chlwebsitesBundle:Ejuridique')
->myFindAll();
您没有获得Projet
个实体,但您获得Ejuridique
个实体。 ->leftjoin()
功能允许您选择(或&#34;过滤&#34;)只有一些特定的ejuridique和->addSelect()
函数来预加载连接的enities。
------ 2 ------
执行此操作时:
{% for projet in ejuridique.projets %}
之后:
return $this->render('chlwebsitesBundle:websites:liste.html.twig', array(
'ejuridiques'=>$ejuridiques,'projets'=>$projets));
您无法访问$projets
变量,只需获取与当前Project
相关联的所有ejuridique
即可。如果您想阅读$projets
的内容,则必须执行以下操作:
{% for projet in projets %}
(但请注意,这不是您的解决方案。
根据这些错误,我强烈建议您花一些时间阅读教程。由于你似乎说法语,我建议这一个:Openclassrooms (ex-Site du Zéro)尤其是this chapter。
答案 2 :(得分:0)
在blacksad强调的实体中,这是一件非常重要的事情......
PHP类名必须以大写字母开头。所以它可以匹配
targetEntity =&#34;叶绿素\ websitesBundle \实体** P ** rojet
targetEntity =&#34;叶绿素\ websitesBundle \实体** P ** HOTO
我试图通过在&#34; projet&#34;上直接添加另一个功能和一个阵列来将抹灰放入我的控制器中。但它只是部分解决了我最初的错误。由&#34; kanalkyte&#34;建议的控制器很好。
谢谢。