Symfony Доступ к родительской сущности внутри класса сущности - PullRequest
0 голосов
/ 08 апреля 2020

В Symfony 5 я создал 2 сущности, связанные с отношением ManyToOne: Project - это родитель, Serie - это дочерний элемент.

Project сущность:

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\SerieRepository")
 */
class Serie
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Project", inversedBy="series")
     * @ORM\JoinColumn(nullable=false)
     */
    private $project;

    [...]
}

Serie сущность:

namespace App\Entity;


use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProjectRepository")
 */
class Project
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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


    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Serie", mappedBy="Project", orphanRemoval=true)
     */
    private $series;

    [...]
}

Я не писал здесь, но у вас также есть все методы получения и установки для каждого класса.

Мне нужен доступ к сущности Project в сущности Serie. Например: доступ к свойству name объекта Project путем добавления метода getProjectName в класс Serie.

    public function getProjectName()
    {
        return $this->project->getName();
    }

Но это не работает, поскольку объект Project не загружен (только Я бы). Как я могу получить это значение, не добавляя хранилище в классе сущностей или передавая аргументы методу getProjectName? (может быть Doctrine аннотация ...).

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Хорошо, спасибо, Джакуми. В этом вы правы, все работает нормально.

Для завершения объяснения, если вы хотите получить дочерние элементы, например:

$series = $project->getSeries();

У вас будет пустая таблица ( foreach l oop не получит ни одного предмета). Это потому, что $ series - это коллекция Doctrine. Вам нужно использовать:

$series = $project->getSeries()->getValues();

, чтобы получить полностью заполненный массив.

Я трачу 2 часа на топи c, надеюсь, это поможет кому-то еще.

0 голосов
/ 08 апреля 2020

В doctrine объектах в отношениях загружается ленивый , это означает, что когда вы не обращались к чему-либо в $this->project (или в ссылочном проекте), это будет просто тип Project^ (обратите внимание на ^), и он будет иметь атрибут с именем __initialized__ (или аналогичный) со значением false (проверка по dump($this->project);). Это означает, что объект еще не загружен.

Lazy-loading означает, что он будет загружен, если это действительно необходимо (таким образом, уменьшая доступ к базе данных), и до этого прокси-объект займет место сущности. Он будет регистрировать все сделанные ему вызовы, при необходимости загружать объект и переадресовывать все вызовы на него.

Итак, чтобы загрузить загруженный с отложенным доступом объект, просто вызовите один из его методы. Так что $this->project->getName() должно уже хорошо работать. (подтвердите, позвонив по номеру dump($this->project); впоследствии).

Если этого не произойдет, чего-то еще не хватает / неправильно / неисправно.

...