Я довольно новичок в Symfony и Doctrine и не могу найти решение своей проблемы.
У меня есть таблица базы данных под названием transactional
и один называется customer
, в transactional
таблица является внешним ключом к customer
Таблица. Теперь я хочу получить все данные из обеих таблиц. Но все поля Customer имеют нулевое значение.
Вот внешний ключ в transactional
php объект:
transactional
:
/**
* @var \AppBundle\Entity\Customer
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="fk_customer", referencedColumnName="id")
* })
*/
private $fkCustomer;
Запрос доктрины:
$em = $this->getDoctrine()->getManager();
$transactions = $em->getRepository('AppBundle:Transactional')->findAll();
dump($transactions);
Результат:
0 => Transactional {#483 ▼
-id: 1
-date: DateTime @1510873200 {#493 ▶}
-fkCustomer: Customer {#566 ▼
+__isInitialized__: false
-id: 1
-gender: null
-firstname: null
Большое спасибо за ваше время и помощь. знак равно
То есть доктрины ленивой загрузки.
Как только вы получите доступ к свойству клиента вашего транзакционного объекта, будет загружена соответствующая информация.
Однако это не идеально, если вы перебираете множество записей транзакций, так как каждый объект клиента будет загружен с помощью одного запроса.
Вы можете решить это либо, установив fetchMode в EAGER
лайк:
/**
* @var \AppBundle\Entity\Customer
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer", fetch="EAGER")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="fk_customer", referencedColumnName="id")
* })
*/
private $fkCustomer;
который должен заполнить данные клиента полностью вместо использования прокси-объекта.
Другим способом будет загрузка элементов транзакции через пользовательский метод репозитория, который явно присоединяет данные клиента.
Например, создав собственный репозиторий для Transactional
и добавьте такую функцию:
public function load()
{
$qb = $this->_em->createQueryBuilder();
$qb->select('t, c')
->from('AppBundle:Transactional','t')
->join('t.fkCustomer', 'c');
return $qb->getQuery()->execute();
}
Как создать собственный репозиторий можно найти в документации: https://symfony.com/doc/3.3/doctrine/repository.html
Вы должны установить тип выборки в нетерпении:
Жаждущий тип: Загрузите связанный объект также.
Ленивый Тип: Загрузите связанный объект по необходимости.
/**
* @var \AppBundle\Entity\Customer
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer",fetch="EAGER")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="fk_customer", referencedColumnName="id")
* })
*/
private $fkCustomer;