【问题标题】:Getting values from related entities cause error从相关实体获取值会导致错误
【发布时间】:2013-11-29 05:00:35
【问题描述】:

我在我的项目中从 SonataAdminBundle 开始,但在获取相关实体时遇到了问题。我有这个实体:

<?php

namespace PI\ProyectoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Event\LifecycleEventArgs;

/**
 * @ORM\Entity
 * @ORM\Table(name="proyectos")
 * @ORM\HasLifecycleCallbacks
 */
class Proyectos {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=45, unique=true, nullable=false)
     */
    protected $nombre;

    /**
     * @ORM\Column(type="boolean", nullable=true)
     */
    protected $estado;

    /**
     * @ORM\Column(type="string", length=45, nullable=false)
     */
    protected $pais;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="PI\ClienteBundle\Entity\Clientes", cascade={"all"})
     * @ORM\JoinColumn(name="cliente", referencedColumnName="id")
     */
    protected $clientes;

    /**
     * @ORM\ManyToMany(targetEntity="PI\CentroBundle\Entity\Centros", inversedBy="proyectos", cascade={"persist"})
     * @ORM\JoinTable(name="proyectos_has_centros",
     *      joinColumns={@ORM\JoinColumn(name="proyectos_id", referencedColumnName="id"),
     *                   @ORM\JoinColumn(name="proyectos_cliente", referencedColumnName="cliente")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="centros_id", referencedColumnName="id")}
     *      )
     */
    protected $centros;

    /**
     * ORM\ManyToMany(targetEntity="Application\Sonata\UserBundle\Entity\User", cascade={"persist"})
     * ORM\JoinTable(name="proyectos_has_system_user",
     *      joinColumns={@ORM\JoinColumn(name="proyectos_id", referencedColumnName="id"),
     *                   @ORM\JoinColumn(name="proyectos_cliente", referencedColumnName="cliente")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="system_user_id", referencedColumnName="id")}
     *      )
     */
    protected $ingenieros;

    public function __construct() {
        $this->centros = new \Doctrine\Common\Collections\ArrayCollection();
        $this->ingenieros = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public function getId() {
        return $this->id;
    }

    public function setNombre($nombre) {
        $this->nombre = $nombre;
    }

    public function getNombre() {
        return $this->nombre;
    }

    public function setEstado($estado) {
        $this->estado = $estado;
    }

    public function getEstado() {
        return $this->estado;
    }

    public function setPais($pais) {
        $this->pais = $pais;
    }

    public function getPais() {
        return $this->pais;
    }

    public function setClientes(\PI\ClienteBundle\Entity\Clientes $clientes) {
        $this->clientes = $clientes;
    }

    public function getClientes() {
        return $this->clientes;
    }

    public function setCentros(\PI\CentroBundle\Entity\Centros $centros) {
        $this->centros[] = $centros;
    }

    public function getCentros() {
        return $this->centros;
    }

    public function setIngenieros(\BIT\UserBundle\Entity\User $ingenieros) {
        $this->ingenieros[] = $ingenieros;
    }

    public function getIngenieros() {
        return $this->ingenieros;
    }

    /**
     * @ORM\PrePersist
     */
    public function prePersist(LifecycleEventArgs $eventArgs) {
        $em = $eventArgs->getEntityManager();
        $q = $em->createQuery('SELECT MAX(p.id) FROM PIProyectoBundle:Proyectos p');
        $id = $q->getSingleResult(\Doctrine\ORM\Query::HYDRATE_SINGLE_SCALAR);
        $this->id = $id + 1;
    }

}

这就是我在 ProyectoAdmin.php 类中配置过滤器的方式:

protected function configureDatagridFilters(DatagridMapper $filter) {
    $filter
            ->add('nombre', null, array('label' => 'Nombre'))
            ->add('estado', null, array('label' => 'Estado'))
            ->add('pais', null, array('label' => 'País'))
            ->add('clientes', null, array('label' => 'Asignar Clientes'))
            ->add('ingenieros', null, array(), null, array('expanded' => true, 'multiple' => true))
            ->add('centros', null, array('label' => 'Asignar Centros'));
}

但我得到这个错误:

注意:未定义的索引:ingenieros in /var/www/html/pingenieros/vendor/sonata-project/doctrine-orm-admin-bundle/Sonata/DoctrineORMAdminBundle/Guesser/FilterTypeGuesser.php 第 64 行

我做错了什么?

【问题讨论】:

    标签: symfony sonata-admin symfony-2.3


    【解决方案1】:

    试试

    ->add('ingenieros', 'entity', array(
                      'class'    => 'AcmeMyBundle:Entity', //your ingenieros entity
                      'property' => 'name', // any class property
                      'multiple' => true,
                                  'expanded' => true))
    

    【讨论】:

      【解决方案2】:

      没关系是我的坏事,请看这段代码:

      /**
       * ORM\ManyToMany(targetEntity="Application\Sonata\UserBundle\Entity\User", cascade={"persist"})
       * ORM\JoinTable(name="proyectos_has_system_user",
       *      joinColumns={@ORM\JoinColumn(name="proyectos_id", referencedColumnName="id"),
       *                   @ORM\JoinColumn(name="proyectos_cliente", referencedColumnName="cliente")},
       *      inverseJoinColumns={@ORM\JoinColumn(name="system_user_id", referencedColumnName="id")}
       *      )
       */
      protected $ingenieros;
      

      应该是:

      /**
       * @ORM\ManyToMany(targetEntity="Application\Sonata\UserBundle\Entity\User", cascade={"persist"})
       * @ORM\JoinTable(name="proyectos_has_system_user",
       *      joinColumns={@ORM\JoinColumn(name="proyectos_id", referencedColumnName="id"),
       *                   @ORM\JoinColumn(name="proyectos_cliente", referencedColumnName="cliente")},
       *      inverseJoinColumns={@ORM\JoinColumn(name="system_user_id", referencedColumnName="id")}
       *      )
       */
      protected $ingenieros;
      

      注意ORM 定义之前的@,这就是问题所在,谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多