У меня очень странный вопрос о настройке и минимизации вызовов базы данных моим приложением 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
и делает нежелательныепризывает здесь к базе данных.
Может кто-нибудь помочь мне выяснить, что на самом деле происходит и как это остановить / настроить, пожалуйста?