У меня есть два класса, которые связаны, используя один-в-одном однонаправленном
{
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)
Эти функции являются частью прокси-кодирования Doctrine, поскольку при использовании Lazy Loading Doctrine необходимо отслеживать дочернюю сущность, загружать ее или нет. Частью этого отслеживания являются эти функции (я считаю, что в эта часть доктрины)
Там может быть способ обойти это, чтобы избежать использования отложенной загрузки. Для этого вы можете использовать EAGER loading если вы всегда хотите, чтобы ребенок загружался вместе с родителем. В качестве альтернативы, если вы хотите использовать EAGER только для этого одного запроса, а не каждый раз, когда вам придется переключаться на DQL как задокументировано здесь или вы можете использовать запятую JOIN (второй пример вниз) Вот
Других решений пока нет …