Как в Doctrine сделать one-to-many с коллекцией?

Доброго дня.
Есть таблица задач, у которых может быть неограниченное количество мета-записей. Казалось бы, типичный one-to-many (одна задача ко многим мета-записям), но когда я прямо это указываю, Симфони ругается на коллекцию (говорит, The return type of method "getMeta" is invalid). Но мне нужно вернуть именно коллекцию - много мета-записей!
/**
 * @ORM\OneToMany(targetEntity="App\Entity\TaskMeta", mappedBy="task")
 */
private $meta;

public function getMeta() :  ? \Collection
{
    return $this->meta;
}

К тому же, моя связь предполагает уникальность, т.е. у одной мета-записи может быть только одна задача, но у задачи может быть много мета-записей.

Как сделать? ManyToOne, которая позволяет возвращать коллекции, не подойдет, т.к. она предполагает много задач к одной мета, а это не мой случай.
  • Вопрос задан
  • 150 просмотров
Решения вопроса 1
@Flying
У вас потенциально две ошибки в приведённом коде:

1. В качестве возвращаемоног типа вы указываете \Collection, тогда как коллекции Doctrine - это \Doctrine\Common\Collections\Collection
2. Ваш код не создаёт эту коллекцию, соответственно если это не entity созданная самой Doctrine при загрузке данных из базы - значение $meta - null. Корректный подход - это либо инициализировать коллекции в конструкторе:
public function __construct() {
  $this->meta = new ArrayCollection(); // где ArrayCollection это \Doctrine\Common\Collections\ArrayCollection
}

либо непосредственно в методе:
public function getMeta() : Collection
{
    if (!$this->meta) {
        $this->meta = new ArrayCollection();
    }
    return $this->meta;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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