我使用此代码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如何处理其中的代理?我还不清楚拥有/反转的方面是如何工作的,也许是因为我做了我的代码所示的事情。对此也有任何建议吗?
答案 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",不是吗?
我希望能帮到你