3

私は2つの文書を持っています。特定の人に関連するすべての論文を見つけようとしています。ドキュメントはコレクションに保存されており、参照はからに作成されていますがPersonPaperその逆はありません。

/** @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();
4

1 に答える 1

2

Paper :: personに「mappedBy」という注釈が付けられている場合、Paperは「所有側」ではなく、教義はPaper::personへの変更を保持しないことを意味します。

クエリを機能させるには、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();

$ personによる論文のクエリ:

$papers = $dm->createQueryBuilder('Paper')
    ->field('person')->references($person)
    ->getQuery()->execute();
于 2013-03-21T23:52:01.827 に答える