为什么我得到NULL而不是相关的“paises”?

时间:2014-10-23 21:17:58

标签: php symfony orm doctrine-orm mapping

我使用此代码FabricanteDistribuidor.php实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="nomencladores.fabricante_distribuidor", schema="nomencladores")
 * @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\FabricanteDistribuidorRepository")
 * @UniqueEntity(fields={"nombre"}, message="El nombre ya está registrado")
 */
class FabricanteDistribuidor
{
    use IdentifierAutogeneratedEntityTrait;
    use NamedEntityTrait;

    // ... some other fields

    /**
     * @ORM\ManyToMany(targetEntity="Sencamer\AppBundle\Entity\Pais")
     * @ORM\JoinTable(name="negocio.fabricante_distribuidor_pais", schema="negocio",
     *      joinColumns={@ORM\JoinColumn(name="fabricante_distribuidor", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="pais_id", referencedColumnName="id")}
     * )
     */
    protected $paises;

    /**
     * Set paises
     *
     * @param  \AppBundle\Entity\Pais $pais
     * @return FabricanteDistribuidor
     */
    public function setPaises(\AppBundle\Entity\Pais $pais)
    {
        $this->paises[] = $pais;
        return $this;
    }

    /**
     * Get paises
     *
     * @return string
     */
    public function getPaises()
    {
        return $this->paises;
    }

}

然后在控制器中我尝试获取一条记录,并且在这种情况下它的关联将是paises全部如下:

public function obtenerDetallesFabricanteAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('AppBundle:FabricanteDistribuidor')->find($request->query->get('id'));

    if ($request->isXmlHttpRequest()) {
        $response['entities'] = array();

        $dataResponse = array();
        // ... some other fields

        $dataResponse['paises'] = $entity->getPaises();

        $response['entities'][] = $dataResponse;

        return new JsonResponse($response);
    }
}

在JSON回复中,我认为一切正常,但paises设置为NULL且关系表fabricante_distribuidor_pais具有fabricante我寻求的价值,为什么?我在ManyToMany关系中做错了什么?

我在dev.log中观看并且从未加入:

  

doctrine.DEBUG:SELECT t0.direccion AS direccion1,t0.telefono AS   telefono2,t0.fax AS fax3,t0.correo AS correo4,t0.id AS id5,   t0.nombre AS nombre6 FROM nomencladores.fabricante_distribuidor t0   在哪里t0.id =? [" 1"] []

为什么?

解决方案及其中的一些问题

阅读并阅读并通过Stackoverflow,Google等进行深入研究后,我得到了解决方案,它正常运行,我不知道如果它是最好的,那么你告诉我:

FabricanteDistribuidor.php

class FabricanteDistribuidor
{
    /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Pais", mappedBy="fabricanteDistribuidor", cascade={"persist"})
     */
    private $paises;


    /**
     * Set paises
     *
     * @param  \AppBundle\Entity\Pais $pais
     * @return FabricanteDistribuidor
     */
    public function setPaises(\Sencamer\AppBundle\Entity\Pais $pais)
    {
        $this->paises[] = $pais;
        return $this;
    }

    /**
     * Get paises
     *
     * @return Doctrine\Common\Collections\Collection
     */
    public function getPaises()
    {
        return $this->paises;
    }

}

Pais.php

class Pais
{
    use IdentifierAutogeneratedEntityTrait;
    use NamedEntityTrait;
    use ActiveEntityTrait;

    /**
     * @ORM\ManyToMany(targetEntity="Sencamer\AppBundle\Entity\FabricanteDistribuidor", inversedBy="paises", cascade={"persist"})
     * @ORM\JoinTable(name="negocio.fabricante_distribuidor_pais", schema="negocio",
     *      joinColumns={@ORM\JoinColumn(name="fabricante_distribuidor", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="pais_id", referencedColumnName="id")}
     * )
     */
    protected $fabricanteDistribuidor;

    /**
     * Add fabricanteDistribuidor
     *
     * @param AppBundle\Entity\FabricanteDistribuidor $fabricanteDistribuidor
     */
    public function addfabricanteDistribuidor(\AppBundle\Entity\FabricanteDistribuidor $fabricanteDistribuidor)
    {
        $this->fabricanteDistribuidor[] = $fabricanteDistribuidor;
    }

    /**
     * Get fabricanteDistribuidor
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getfabricanteDistribuidor()
    {
        return $this->fabricanteDistribuidor;
    }

}

然后在我的控制器中,我遍历请求,查找我要添加的每个pai,并在持久保存对象时将其刷新:

if ($fabricanteDistribuidorForm->isValid()) {
    try {
        $em->persist($fabricanteDistribuidorEntity);
        $em->flush();

        $formDataPais = $request->get('fabricanteDistribuidor')['pais'];
        foreach ($formDataPais as $paisId) {
            $pais = $em->getRepository('AppBundle:Pais')->find($paisId);
            $fabricanteDistribuidorEntity->setPaises($pais);
            $em->flush();
        }

        $response['entities'][] = $dataResponse;
    } catch (Exception $ex) {
        $response['success'] = FALSE;
        $response['error'] = $ex->getMessage();
    }
} else {
    return $this->getFormErrors($fabricanteDistribuidorForm); ;
}

这样一切正常,数据以正确的方式保存。现在围绕这个解决方案,我有另一个问题和一个问题。我的问题是,我现在尝试从paises获取相关的FabricanteDistribuidor,因为我找不到他们的名字,所以我做错了我的代码错了吗?

public function obtenerDetallesFabricanteAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('AppBundle:FabricanteDistribuidor')->find($request->query->get('id'));

    if ($request->isXmlHttpRequest()) {
        $response['entities'] = array();

        $dataResponse = array();
        // rest of columns  .... 

        if ($entity->getPaises() instanceof Pais) {
            $paises = array();
            foreach ($entity->getPaises() as $pais) {
                $paises[] = $pais->getNombre();
            }

            $dataResponse['paises'] = $paises;
        }

        $response['entities'][] = $dataResponse;
        return new JsonResponse($response);
    }
}

问题出在Pais类附近,因为您注意到我添加了反向边$fabricanteDistribuidor所以,我是否必须在我想插入新Pais时插入此内容只是告诉Doctrine如何处理其中的代理?我还不清楚拥有/反转的方面是如何工作的,也许是因为我做了我的代码所示的事情。对此也有任何建议吗?

1 个答案:

答案 0 :(得分:1)

我的n-m实现是这样的:

   /**
     * @ORM\ManyToMany(targetEntity="Sencamer\AppBundle\Entity\Pais")
     * @ORM\JoinTable(name="negocio.fabricante_distribuidor_pais", schema="negocio",
     *      joinColumns={@ORM\JoinColumn(name="fabricante_distribuidor_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="pais_id", referencedColumnName="id")}
     * )
     */

检查你的连接句中是否有" fabricante_distribuidor"是一个" id"。 请记住,您需要在构造函数中设置" paises"像arrayCollection:

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

并且在n-m关系中是一个很好的做法创建addPaises而不是setPaises:

public function addPais(\AppBundle\Entity\Pais $pais){
    $this->paises[] = $pais;
    return $this;
}

我认为,在您的代码中的某处,您可以添加" paises"你的" fabricante.distribuidor",不是吗?

我希望能帮到你