Как использовать ассоциации «многие к одному» в Doctrine 2

Я использую Doctrine 2 в Zend.

Я пытаюсь выяснить, как получить доступ к свойствам/методам для связанных моделей из текущего объекта.

Например, у нас есть две таблицы: «Школы» и «Студенты».

Многие учащиеся относятся к школе, так что это отношение многие к одному, и меня интересует только перечисление всех учащихся для каждой школы. Я не хочу запрашивать записи учащихся, чтобы найти сведения о школе, к которой они принадлежат, поэтому это классифицируется как однонаправленная связь.

Теперь, чтобы настроить отношение многие к одному в Doctrine 2 между таблицами, я бы добавил это в сущность Студенты, так как это сторона-владелец:

/**
 * @ManyToOne(targetEntity="Schools")
 * @JoinColumn(name="school_id", referencedColumnName="school_id")
 */
private $schoolId;

Где значения имен соответствуют именам столбцов в таблицах студентов и школ соответственно.

Итак, если у меня есть объект записи Schools, как мне получить доступ к свойствам/методам учащихся?

echo $oSchool->Students->getName(); // doesn't work

Я не могу понять, что я сделал не так, генерируется прокси-класс. Ценю это, если кто-нибудь может указать мне в правильном направлении.


person Mr B    schedule 18.07.2011    source источник


Ответы (3)


В объекте «Школы» вы хотели бы иметь что-то вроде этого

/**
 * @param \Doctrine\Common\Collections\Collection $property
 * @OneToMany(targetEntity="Students", mappedBy="school")
 */
private $student;

public function __construct() {
    $this->student = new \Doctrine\Common\Collections\ArrayCollection();
}

public function getStudent() {
    return $this->student;
}

С этим вы можете сделать что-то вроде следующего, что даст вам ArrayCollection со всеми студенческими объектами

$studentsArray = $school->getStudent();

Надеюсь, это поможет... Docrine 2 очень мощная, но некоторые вещи не очень хорошо задокументированы. Дополнительную информацию об этом можно найти в документации по адресу Работа с ассоциациями.

person MrMorice    schedule 19.07.2011
comment
Будет ли это работать, даже если у меня нет student_id в таблице школ? - person Mr B; 19.07.2011
comment
В этом случае у вас не будет student_id в таблице school, а будет school_id в таблице student. Таким образом, вы можете связать многих учеников с одной школой. - person MrMorice; 19.07.2011
comment
Я попробовал подход, который вы изложили, и получил следующие ошибки: Предупреждение: для foreach() указан недопустимый аргумент в C:\xampplite\htdocs\test\library\Doctrine\ORM\Persisters\BasicEntityPersister.php в строке 1205 Неустранимая ошибка: вызов функция-член setValue() для не-объекта в C:\xampplite\htdocs\test\library\Doctrine\ORM\PersistentCollection.php в строке 168 - person Mr B; 19.07.2011
comment
Может быть, вы хотите опубликовать оба написанных вами класса. С этими битами кода почти невозможно отладить ваш код. - person MrMorice; 05.08.2011

Для тех, кто столкнулся с этой проблемой: «Неустранимая ошибка: вызов функции-члена setValue() для не-объекта в C:\xampplite\htdocs\test\library\Doctrine\ORM\PersistentCollection.php в строке 168 —»

Решение. Необходимо заменить значение mappedBy значением свойства доктрины вместо имени столбца таблицы.

Ex:

Правильный синтаксис: @ORM\OneToMany(targetEntity="Test\Entity\School", mappedBy="school")

Неверный синтаксис: правильный синтаксис: @ORM\OneToMany(targetEntity="Test\Entity\School", mappedBy="school_id")

person khanz    schedule 14.07.2014

Я добился некоторого прогресса. Я прочитал 'Работа с объектами' документации Doctrine 2.

Доступ к связанным объектам можно получить примерно так (согласно примеру, приведенному в моем вопросе):

$oStudent->getSchoolId()->getName(); // gets a student's school's name by traversing the school class

Однако в моем первоначальном вопросе я хотел получить доступ к ученикам, принадлежащим к школе, через объект школы. Я полностью озадачен тем, как это сделать, мне кажется, это невозможно.

person Mr B    schedule 19.07.2011