2

このような2つの単純なドキュメントがあり、1人の人が多くの論文を所有できますが、論文は1人の個人にしか所属できないとします。

namespace Dashboard\Document;

use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/** @ODM\Document(db="testing", collection="person")
 * @ODM\InheritanceType("COLLECTION_PER_CLASS")
 */
class Person
{
/**
 * @ODM\Id
 */
protected $id;

/** @ODM\Field(type="string") */
protected $slug;

/** @ODM\Field(type="string") */
protected $name;

/** @ODM\ReferenceMany(targetDocument="Paper", cascade={"all"}) */
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);
}
}
namespace Dashboard\Document;

use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/** @ODM\Document(db="testing", collection="paper")
 * @ODM\InheritanceType("COLLECTION_PER_CLASS")
 */
class Paper
{
/**
 * @ODM\Id
 */
protected $id;

/** @ODM\Field(type="string") */
protected $name;

/** @ODM\ReferenceOne(targetDocument="Person", cascade={"all"}) */
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);
}
}

片方の端で参照を作成するときにどこかで読んだと思いましたが、DoctrineODMは両側で参照を自動的に作成します。したがって、以下のステートメントを実行すると、紙のドキュメントからの人への参照が表示されます。また、人のドキュメント内の紙への参照も表示されます。

//For demo sake; $person already contains a Person document
try {
    $paper = $dm->getRepository('\Dashboard\Document\Paper')
            ->find($paperId);
} catch (\Doctrine\ODM\MongoDB\MongoDBException $e) {
    $this->setStatusFailure($e->getMessage());
    $this->sendResponse();
}    

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

私がそれをして、mongodbをチェックすると、紙からの参照->人がそこにいます。しかし、参照者は表示されません->データベースに表示されている紙。カスケードアノテーションがこれに役立つと思いましたが、明らかに何かが足りません。

参照が両端に含まれていることを確認して、クエリを実行して1人の人物に属するすべての論文を表示するにはどうすればよいですか?これは手動で行う必要がありますか、それともDoctrineにこれを処理させることができますか?

アップデート

このページの最初の段落は、それが可能だと私に思わせました。

http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/bidirection-references.html

4

1 に答える 1

1

そのページ全体を読むべきだったことがわかりました。マップされたByとinversedByを使用し、AnnotationにinversedByが含まれるドキュメントを常に保持すると、双方向の関係が得られます。

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

//Will give me a relationship I can query on both sides
$person->papers->add($paper);
于 2012-06-06T20:48:16.863 に答える