2010-07-22 3 views
4

제 질문은 분명하지 않지만 여기에 요점을 설명하려고합니다. 나는 사용자가 선생님이 될 수있는 많은 것을 자기 참조하는 관계가 있다고 가정하고 선생님은 학생이 될 수 있습니다. (질문에 대답 할 수는 있지만 너무 많이 물을 수도 있습니다.) Doctrine : 관계에 요소를 추가하는 방법

namespace Entities; 
/** @Entity @Table(name="users")) */ 
class User { 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @Column(type="string", length="30") 
    */ 
    private $name; 
    /** 
    * @ManyToMany(targetEntity="User", inversedBy="teachers") 
    * @JoinTable(name="Teachers_Students", 
    *    joinColumns={@JoinColumn(name="teacher", referencedColumnName="id")}, 
    *    inverseJoinColumns={@JoinColumn(name="student", referencedColumnName="id")} 
    *    ) 
    */ 
    private $students; 
    /** 
    * @ManyToMany(targetEntity="User", mappedBy="students") 
    */ 
    private $teachers; 

    function getName() { 
     return $this->name; 
    } 
    function setName($name) { 
     $this->name = $name; 
    } 
    function getStudents() { 
     return $this->students; 
    } 
    function getTeachers() { 
     return $this->teachers; 
    } 
} 

내가 소수의 사용자

$user1 = new User; 
$user1->setName("user 1"); 
$user2 = new User; 
$user2->setName("user 2"); 
$user3 = new User; 
$user3->setName("user 3"); 
$user4 = new User; 
$user3->setName("user 4"); 

을 가지고 내가, 내가, doctrine reference을 읽고 있었다 그들 사이에 설정 교사 - 학생 관계에 좋아 u는에 요소를 추가 할 Collections::add()를 사용할 수있는 것을보고 말 컬렉션

// user1 is a teacher to user2 & 3 
$user1->getStudents()->add($user2); 
$user1->getStudents()->add($user3); 

// user2 is a teacher to user3 
$user2->getStudents()->add($user3); 

// user4 is a student to user2 
// tests if adding something from the inverse side works 
$user4->getTeachers()->add($user2); 

그러나 이것은

Fatal error: Call to a member function add() on a non-object in D:\ResourceLibrary\Frameworks\Doctrine\tools\sandbox\index.php on line 70

01 실패

컬렉션이나 관계에 요소를 추가하려면 어떻게해야합니까?

답변

7

컬렉션 변수는 단지 일반 클래스 속성입니다. 즉 초기화 할 때까지 null이됩니다. 일반적으로 Doctrine의 ArrayCollection 클래스를 사용하여 인스턴스를 생성하면 설명 된 메서드를 사용할 수 있습니다.

이 시도 :

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

} 
+0

덕분에, 그것을 해결되는. 하지만 모든 관계에 대해 그렇게해야합니까? 문서의 샘플 코드는 이와 같이 관계를 초기화해야한다고 지정하지 않습니다. '@ OneToMany','@ ManyToMany' 등을 사용한다고 말했습니다. annotations –

+0

위의 링크는 깨졌지만 몇 시간 동안 때때로이 속성이 제대로 초기화되지 않는 경우가 종종 있습니다. – danielrvt

관련 문제