Symfony / Doctrine: выберите несколько таблиц

Я довольно новичок в 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

Большое спасибо за ваше время и помощь. знак равно

0

Решение

То есть доктрины ленивой загрузки.

Как только вы получите доступ к свойству клиента вашего транзакционного объекта, будет загружена соответствующая информация.

Однако это не идеально, если вы перебираете множество записей транзакций, так как каждый объект клиента будет загружен с помощью одного запроса.

Вы можете решить это либо, установив 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

1

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

Вы должны установить тип выборки в нетерпении:

Жаждущий тип: Загрузите связанный объект также.

Ленивый Тип: Загрузите связанный объект по необходимости.

/**
* @var \AppBundle\Entity\Customer
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer",fetch="EAGER")
* @ORM\JoinColumns({
*   @ORM\JoinColumn(name="fk_customer", referencedColumnName="id")
* })
*/
private $fkCustomer;
1

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