Почему я получил NULL вместо связанных «paises»?

Я 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: ВЫБЕРИТЕ t0.direccion AS direccion1, t0.telefono AS
telefono2, t0.fax AS fax3, t0.correo AS correo4, t0.id AS id5,
t0.nombre AS nombre6 ОТ номенклатора. фабрика_дистрибутор 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;
}

}

Затем в моем контроллере я перебираю запрос в поисках каждого пейса, который я хочу добавить, и сбрасываю его, когда объект сохраняется:

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 или просто рассказать доктрине, как бороться с прокси внутри нее? Я пока не ясно, как работает владение / обратная сторона, но, возможно, из-за этого я сделал то, что показывал мой код. Любой совет по этому поводу тоже?

0

Решение

мои н-м реалии такие:

   /**
* @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», не так ли?

Я надеюсь, что это поможет вам

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]