Доктрина Symfony ленивая загрузка второго ребенка от отношений OneToOne - PullRequest
0 голосов
/ 16 октября 2019

У меня очень странный вопрос о настройке и минимизации вызовов базы данных моим приложением Symfony. У меня есть 3 связанных объекта, а именно (например) Book, Author и Publisher, и они связаны отношениями OneToOne, как показано ниже:

Book
{
    /**
     * @var Author
     *
     * @ORM\OneToOne(targetEntity="App\Entity\Author", mappedBy="book", cascade={"persist", "remove"})
     */
    private $author;
}
Author
{
    /**
     * @var Book
     *
     * @ORM\OneToOne(targetEntity="App\Entity\Book", inversedBy="author", cascade={"persist", "remove"})
     */
    private $book;

    /**
     * @var Publisher|null
     *
     * @ORM\OneToOne(targetEntity="App\Entity\Publisher", mappedBy="author", cascade={"remove", "persist"}, orphanRemoval=true)
     */
    private $publisher;
}
Publisher
{
    /**
     * @var Author
     *
     * @ORM\OneToOne(targetEntity="App\Entity\Author", inversedBy="publisher")
     * @ORM\JoinColumn(name="author_id", referencedColumnName="id", nullable=false)
     */
    private $author;
}

Теперь, если я сделаю вызов для извлечения всех записей базы данных книг, как показано ниже:

$this->getDoctrine()->getRepository('AppBundle:Author')->findAll();

, это сделает только 1 вызов в базу данных, но когда я пытаюсь сделать тот же вызов для Bookсущность точно так же:

$this->getDoctrine()->getRepository('AppBundle:Book')->findAll();

приводит к тысяче звонков. Из моей отладки я нашел один вызов, чтобы получить все книги, но затем сделал несколько вызовов (2558 вызовов в моем случае), пытаясь найти отношения Author->Publisher. Это большая трата памяти, процессора, времени и производительности.

Чтобы копнуть немного глубже, кажется (хотя я не уверен на 100%), он пытается HydrateAllData и делает нежелательныепризывает здесь к базе данных.

Может кто-нибудь помочь мне выяснить, что на самом деле происходит и как это остановить / настроить, пожалуйста?

...