symfony2 - PHP - 未定义的索引 - 表连接

时间:2014-05-22 08:58:55

标签: symfony doctrine-orm entity one-to-many

我是Symfony2的新手,并开发了我的第一个项目

  • 1实体" ejuridique"谁与
  • 有1个onetomany关系
  • 1实体" projet"谁与
  • 有1个onetomany关系
  • 1实体"照片"。

我想为每个" 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;我收到此错误

我希望我的问题很明确,并且我已经提供了所有必要的信息。

提前感谢您的帮助。

3 个答案:

答案 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;建议的控制器很好。

谢谢。