Задать вопрос
@NkDev

Как в Symfony создать взаимную связь ManyToMany?

Делаю проект на Symfony.
У меня есть две сущности: "Книга" и "Автор".
По задумке у каждой книги может быть несколько авторов, а каждый автор может написать несколько книг.
Для этого я решил связать их отношением ManyToMany.
Сначала, с помощью генератора, я создал сущность "Автор", затем "Книга".
В результате я получил в базе данных новую таблицу "book_author" для связи этих двух таблиц.
Теперь в коде я могу получить массив всех авторов данной книги:

$authorCollection = $book->getAuthor();

Однако мне так же нужна обратная операция - получить аналогичным способом все книги определенного автора.
Я добавил необходимые методы и свойства в Author, аналогичные тем, что были в Book.

$bookCollection = $author->getBook();

Однако я получаю такую ошибку:

An exception occurred while executing a query: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'app.author_book' doesn't exist


Т.е. скрипт пытается найти таблицу "author_book" а не "book_author".
Вот код сущности Author:

<?php

namespace App\Entity;

use App\Repository\AuthorRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: AuthorRepository::class)]
class Author
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 255)]
    private ?string $name = null;

    #[ORM\ManyToMany(targetEntity: Book::class, cascade: ['persist'])]
    private Collection $book;

    public function __construct()
    {
        $this->book = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    /**
     * @return Collection<int, Book>
     */
    public function getBook(): Collection
    {
        return $this->book;
    }

    public function addBook(Book $book): self
    {
        if (!$this->book->contains($book)) {
            $this->book->add($book);
        }

        return $this;
    }
}
  • Вопрос задан
  • 523 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
BoShurik
@BoShurik
Symfony developer
https://www.doctrine-project.org/projects/doctrine...

Пропустили параметры mappedBy и inversedBy
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы