【问题标题】:symfony2 - PHP - undefined index - Tables joinsymfony2 - PHP - 未定义的索引 - 表连接
【发布时间】:2023-03-19 10:37:01
【问题描述】:

我是 Symfony2 的新手,正在开发我的第一个项目

  • 1 个实体“ejuridique”,与 1 个单机关系
  • 1 个实体“projet”与 1 个单机关系
  • 1 个实体“照片”。

我想要一张表格,为每个“ejuridique”显示 ejuridique 名称和他的第一个项目的第一张照片。

但是,目前,当我使用 2 个级联 leftjoin 从控制器调用我自己的函数时,我收到错误“未定义的索引:chl\websitesBundle\photo”。

树枝“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 个实体

法律

class ejuridique
{

  /**
   * @ORM\OneToMany(targetEntity="chl\websitesBundle\Entity\Projet", mappedBy="ejuridique")
   * @ORM\JoinColumn(nullable=false)
   */
  private $projets;

项目

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;

}

因此,对于所有这些文件,我暂时收到错误“ContectErrorException:注意:未定义索引:chl\websitesBundle\Entity\Photo”但是

  • 当我从控制器调用我的 ejuridique 存储库中的简单“findall()”时,我得到了所有 ejuridique 及其所有项目和所有图片。因此,我认为我的实体和数据库一切正常。

  • 当我调用我的函数“myFindAll”时,在“ejuridique”和“projet”之间只有 1 个leftjoin 参数时也是如此。一切正常。

  • 只有在我自己的函数“myFindAll”中有 2 个级联 leftjoin 时,我才会收到此错误

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

提前感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    我认为你混淆了一些东西(或者我并没有真正理解你想要做什么 :-D)。

    ------ 1 ---------

    当你这样做时:

    $projets = $em->getRepository('chlwebsitesBundle:Ejuridique')
                  ->myFindAll();
    

    你没有得到Projet 实体,但你得到了Ejuridique 实体。 -&gt;leftjoin() 函数允许您仅选择(或“过滤”)某些特定的 ejuridique 和 -&gt;addSelect() 函数以预加载加入的实体。

    ------ 2 ------

    当你这样做时:

    {% for projet in ejuridique.projets %}
    

    之后:

    return $this->render('chlwebsitesBundle:websites:liste.html.twig', array(
        'ejuridiques'=>$ejuridiques,'projets'=>$projets));
    

    您不会访问您的$projets 变量,您只会获得与当前ejuridique 链接的所有Project。如果你想阅读$projets的内容,你必须这样做:

    {% for projet in projets %}
    

    (但请注意,这不是您的解决方案。

    根据这些错误,我强烈建议您花一些时间阅读教程。由于您似乎会说法语,我建议您这样做:Openclassrooms (ex-Site du Zéro) 特别是 this chapter

    【讨论】:

    • 我通知你,在我学习 symfony2 的第三天之后,我能够编写所有这些文件,特别感谢我学习的这个 openclasrooms 课程。但我理解你的评论。我或多或少明白我不必编写 --array('projets'=>$projets) -- 但我这样做是因为我的函数 'myFindAll' 显示索引错误。
    • 所以我想尝试另一件事。我承认这很混乱。我向您确认,当我只使用 --array('ejuridiques'=>$ejuridiques') 时,我的函数 'myFindAll' 出现了这个索引错误。我检查了我的数据库。所有的指标看起来都不错。
    • 请不要在我的回答中看到任何冒犯。我了解您是初学者(就像我不久前一样),但我认为您应该花更多时间学习基础知识(例如,PHP 类名总是以大写字母开头)。痛苦但回报丰厚的投资,从长远来看,它可能会节省您的时间和精力。特别是如果它是一个专业项目。如您所见,Openclassroom tuto 非常好,确实有您需要的一切(如果没有,一旦您了解 Openclassroom 中的内容,您将能够找到并理解其他 tuto)。祝你好运,玩得开心!
    • 我在教程中看到 PHP 类名必须以大写字母开头,但我还没有完全集成。感谢您,它现在已完全集成。我认为每个人都有自己的方式来推动前进。正如你所说,我们玩得很开心,我希望你以后能再次帮助我:-)
    【解决方案2】:

    只需将其更改为您的控制器:

    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');
                // ...
    

    【讨论】:

    • 你是对的。那是没用的东西。但不幸的是,删除它并不会像你想象的那样改变我的索引错误。即使我的索引在我的数据库中看起来不错,我认为我必须以这种方式检查。
    【解决方案3】:

    这在我的实体中是一件很重要的事情,就像 blacksad 强调的那样......

    PHP 类名必须以大写字母开头。所以它可以匹配

    targetEntity="chl\websitesBundle\Entity**P**rojet

    targetEntity="chl\websitesBundle\Entity**P**hoto

    我试图通过直接在“projet”上添加另一个函数和一个数组来将石膏放在我的控制器中,但这只是部分解决了我最初的错误。 “kanalkyte”推荐的控制器不错。

    谢谢。

    【讨论】:

      猜你喜欢
      • 2014-02-01
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多