Доктрина, не уважающая самореферентные отношения

У меня есть объект User с самореферентным отношением "один ко многим" - каждый User владеет набором студентов (которые также являются пользователями):

<?php

namespace AppBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\Common\Collections\ArrayCollection;


/**
 * User
 */
class User extends BaseUser
{
    /**
     * @var int
     */
    protected $id;

    private $students;

    // ....

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    public function __construct() {
        $this->students = new ArrayCollection();
        // ...
        parent::__construct();
    }
    /**
     * Remove student
     *
     * @return User
     */
    public function removeStudent($student)
    {
        $this->students->removeElement($student);
        return $this;
    }

    /**
     * Add a student
     *
     * @param User $students
     *
     * @return User
     */
    public function addStudent($student)
    {
        $this->students->add($student);
        return $this;
    }

    /**
     * Get students
     *
     * @return User
     */
    public function getStudents()
    {
        $this->students;
    }

    /**
     * Set students
     *
     * @param User $students
     *
     * @return User
     */
    public function setStudents($students)
    {
        $this->students = $students;

        return $this;
    }
    // ....
}

Сопоставление выполняется как однонаправленный режим "один ко многим" с присоединяемой таблицей

AppBundle\Entity\User:
    type: entity
    table: null
    repositoryClass: AppBundle\Repository\UserRepository
    id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
    fields:

    // ...

    manyToMany:
      students:
        targetEntity: User
        joinTable:
          name: mentors_students
          joinColumns:
            mentor_id:
              referencedColumnName: id
          inverseJoinColumns:
            student_id:
              referencedColumnName: id
              unique: true              
    lifecycleCallbacks: {  }

Теперь, когда я добавляю/редактирую пользователя с помощью пакета EasyAdmin, я могу добавить учеников для этого пользователя. Однако, когда я извлекаю сущность, свойство student всегда имеет значение null. Например, когда я просматриваю список пользователей:

введите здесь описание изображения

Здесь предполагается, что пользователь «sagarl3232» является учеником «sj», но представление выше ясно показывает, что свойство, когда оно получено, имеет значение null.

Сущность правильно сохраняется в базе данных. То есть таблица соединения имеет правильные значения:

введите здесь описание изображения

Почему Doctrine делает это со мной? Разве это не должно автоматически гидратировать массив студентов?


person Sagar Limaye    schedule 21.07.2017    source источник
comment
причина для минуса?   -  person Sagar Limaye    schedule 21.07.2017
comment
Вы проверяли (например, панель инструментов отладки symfony), выдает ли доктрина правильный запрос при загрузке этой страницы? Можете ли вы воспроизвести его более изолированно, вне EasyAdmin?   -  person simon.ro    schedule 22.07.2017
comment
Да! На самом деле, доктрина выдает запрос, чтобы получить всех связанных студентов, например: SELECT ..., u0_.mentor_id AS mentor_id_17 FROM user u0_ WHERE u0_.id IN (?) ORDER BY u0_.id DESC Parameters: [ 0 => [ 0 => 8, 1 => 7, 2 => 6, 3 => 5, 4 => 1 ] ]   -  person Sagar Limaye    schedule 22.07.2017
comment
@simon.ro Как видите, для получения связанных пользователей задано множество параметров, и они верны в соответствии с базой данных. Идентификаторы теперь другие, потому что я очистил свою базу данных и снова добавил пользователей, но у меня все еще та же проблема.   -  person Sagar Limaye    schedule 22.07.2017
comment
@simon.ro Я сомневаюсь, что это ошибка EasyAdmin, потому что я получил нулевое значение, когда пытался получить студентов в своем приложении, выполнив $user->getStudents().   -  person Sagar Limaye    schedule 22.07.2017


Ответы (1)


Ваш геттер ничего не возвращает!

/**
 * Get students
 *
 * @return User[]
 */
public function getStudents()
{
    return $this->students;
}

Кстати, почему вы также должны настроить докблок. Геттер должен вернуть массив User[]

person simon.ro    schedule 21.07.2017
comment
Теперь у меня новая проблема, я не могу редактировать массив студентов для пользователя:/ - person Sagar Limaye; 22.07.2017