2012-06-06 25 views
3

我有兩個文件。我正在嘗試查找與特定人員相關的所有論文。文件保存在他們的收藏中,並且正在創建從PersonPaper的參考,但不是相反。ODM:無法實現雙向關係

/** @ODM\Document */ 
class Paper 
{ 
/** 
* @ODM\Id 
*/ 
protected $id; 

/** @ODM\ReferenceOne(targetDocument="Person", cascade={"all"}, mappedBy="papers") */ 
protected $person; 


public function __get($property) { 
    return $this->$property; 
} 

public function __set($property, $value) { 
    $this->$property = $value; 
} 


public function toArray() { 
    return get_object_vars($this); 
} 
} 
/** @ODM\Document */ 
class Person 
{ 
/** 
* @ODM\Id 
*/ 
protected $id; 

/** @ODM\ReferenceMany(targetDocument="Paper", cascade={"all"}, inversedBy="person") */ 
protected $papers; 


public function __get($property) { 
    return $this->$property; 
} 

public function __set($property, $value) { 
    $this->$property = $value; 
} 


public function toArray() { 
    return get_object_vars($this); 
} 
} 

創建一個新的雙向參考

$person = $dm->getRespository('Person')->find($person_id); 

$paper = new Paper(); 
$person->papers->add($paper); 

$dm->persist($person); 
$dm->flush(); 

在代碼後來,該查詢返回0的結果;難道它不應該歸還指定人員寫的文件嗎?

$papers = $dm->createQueryBuilder('Paper') 
    ->field('person.$id')->equals(new \MongoId($person_id_as_string)) 
    ->getQuery()->execute(); 

回答

2

如果皮::人都標註有「的mappedBy」這意味着紙是不是「擁有側」和學說不會存留任何改變紙::人。

爲了使您的查詢工作,讓Paper爲擁有方,讓Paper存儲對Person的引用。

/** @ODM\Document */ 
class Person 
{ 
    /** @ODM\ReferenceMany(targetDocument="Paper", mappedBy="person") */ 
    protected $papers; 
} 

/** @ODM\Document */ 
class Paper 
{  
    /** @ODM\ReferenceOne(targetDocument="Person", inversedBy="papers") */ 
    protected $person; 
} 

創建紙張和堅持以人蔘考:由$人

$person = $dm->getRespository('Person')->find($person_id); 

$paper = new Paper(); 
$paper->person = $person; 

$dm->persist($paper); 
$dm->flush(); 

查詢關鍵詞:

$papers = $dm->createQueryBuilder('Paper') 
    ->field('person')->references($person) 
    ->getQuery()->execute(); 
+0

,如果我想什麼來查詢的「紙張」的一面原始代碼示例是否可以訪問對Person的引用? –

+0

你能改說這個嗎?我不確定你是什麼意思。 –