Учение Symfony 3 «один к одному», возвращающее ненужные поля при запросах

У меня есть два класса, которые связаны, используя один-в-одном однонаправленном

{
id: 1,
name: "onetooneuniparent name",
onetooneunichild: {
id: 1,
name: "onetooneunichild name",
__initializer__: null,
__cloner__: null,
__isInitialized__: true
}
}

выше, результат, когда я делаю запрос, как показано

http://localhost:8000/onetooneRead?id=1

Я хочу знать, откуда и почему пришло следующее

__initializer__: null,
__cloner__: null,
__isInitialized__: true

мой ожидаемый результат именно это

{
id: 1,
name: "onetooneuniparent name",
onetooneunichild: {
id: 1,
name: "onetooneunichild name"}
}

OnetoOneUniParent.php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table(name="onetooneuniparent")
*/

class OnetoOneUniParent{

/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\Column(type="string",name="name")
*/
private $name;

/**
* @ORM\OneToOne(targetEntity="OnetoOneUniChild",cascade={"persist"})
* @ORM\JoinColumn(name="child_id", referencedColumnName="id")
*/
private $onetooneunichild;

<.... getter and setter here ...>
}

OnetoOneUniChild.php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table(name="onetooneunichild")
*/
class OnetoOneUniChild{

/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\Column(type="string",name="name")
*/
private $name;

<.... getter and setter here ...>

Это метод в контроллере

/**
* @Route("/onetooneRead")
* @Method("GET")
*/
public function onetooneReadAction(Request $request){
$logger = $this->get('logger');
$encoders = array(new XmlEncoder(), new JsonEncoder());
$normalizers = array(new ObjectNormalizer());

$serializer = new Serializer($normalizers, $encoders);

$logger->info('onetoone Read');

$id = $request->query->get("id");

$em = $this->getDoctrine()->getManager();
$onetooneuniparent = $em->getRepository('AppBundle:OnetoOneUniParent')->find($id);

$onetooneuniparentJson = $serializer->serialize($onetooneuniparent, 'json');

$response = new JsonResponse();

$response->setContent($onetooneuniparentJson);

return $response;
}

Это то, что внутри в MySQL

mysql> select * from onetooneuniparent;
+----+----------+------------------------+
| id | child_id | name                   |
+----+----------+------------------------+
|  1 |        1 | onetooneuniparent name |
|  2 |        2 | onetooneuniparent name |
|  3 |        3 | onetooneuniparent name |
+----+----------+------------------------+
3 rows in set (0.00 sec)

mysql> select * from onetooneunichild;
+----+-----------------------+
| id | name                  |
+----+-----------------------+
|  1 | onetooneunichild name |
|  2 | onetooneunichild name |
|  3 | onetooneunichild name |
+----+-----------------------+
3 rows in set (0.00 sec)

0

Решение

Эти функции являются частью прокси-кодирования Doctrine, поскольку при использовании Lazy Loading Doctrine необходимо отслеживать дочернюю сущность, загружать ее или нет. Частью этого отслеживания являются эти функции (я считаю, что в эта часть доктрины)

Там может быть способ обойти это, чтобы избежать использования отложенной загрузки. Для этого вы можете использовать EAGER loading если вы всегда хотите, чтобы ребенок загружался вместе с родителем. В качестве альтернативы, если вы хотите использовать EAGER только для этого одного запроса, а не каждый раз, когда вам придется переключаться на DQL как задокументировано здесь или вы можете использовать запятую JOIN (второй пример вниз) Вот

1

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

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

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