zf2 doctrine odm AND查询所有参考数据

时间:2015-03-11 19:55:49

标签: php mongodb doctrine-orm zend-framework2 doctrine-odm

我对mongo和doctrine ODM不同,但不是ORM。我有一个marquees文档和一个问题文档。我想将问题作为自己的集合存在,但是在保存可以将问题附加到选框的选取框时。然后,我希望能够通过其id获取一个选取框,并将问题文档作为选取框中的数据。

/**
* Marquees
*
* @ODM\Document(collection="marquees", repositoryClass="MarqueesRepository")
*/
class Marquees {

    /** @ODM\Id(strategy="AUTO") */
    protected $id;

    /** @ODM\ReferenceMany(targetDocument="Problems", cascade="all") */
    protected $problems;

    public function addProblems(Problems $problem) {
        $this->problems[] = $problem;
    }
} 

我也有问题文件

/**
* Problems
*
* @ODM\Document(collection="problems", repositoryClass="ProblemsRepository")
*/
class Problems {

    /** @ODM\Id(strategy="AUTO") */
    protected $id;

    /** @ODM\ReferenceOne(targetDocument="Marquees") */
    protected $marquee;

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

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

    public function setProblem($problem) {
        $this->problem = $problem;
    }

}

我创建了一个新的选取框,并保存了一个问题,这似乎是正确的。

$marquee = new Marquees;
$this->odm->persist($marquee);
$class = new \Watch\IdeasFactory\Documents\Problems;
$class->setProblem($data->problems['problem']);
$marquee->addProblems($class);
var_dump($this->odm->flush());die();

> db.marquees.find().pretty()
{
    "_id" : ObjectId("55008c95b5c14186118b4567"),
    "problems" : [
        DBRef("problems", ObjectId("55008c95b5c14186118b4568"))
    ]
}

> db.problems.find().pretty()
{ "_id" : ObjectId("55008c95b5c14186118b4568"), "problem" : "testing" }

接下来我想通过它的id获取这个选取框并导出它或者有两个文档的水合数组。但这就是我遇到麻烦的地方。我可以通过使用QueryBuilder并将hydrating设置为false来获取选取框,但它只是给了我一个没有引用文档问题的数组。

public function fetchById($id) {
    $marquees = $this->createQueryBuilder('Marquees')
          ->field('id')->equals($id)
          ->hydrate(false)
          ->getQuery()
          ->getSingleResult();
}

array (
  '_id' => 
  MongoId::__set_state(array(
     '$id' => '55008c95b5c14186118b4567',
  )),
  'problems' => 
      array (
        0 => 
        array (
          '$ref' => 'problems',
          '$id' => 
          MongoId::__set_state(array(
             '$id' => '55008c95b5c14186118b4568',
          )),
          '$db' => 'watch_my_idea',
        ),
      ),
    )

如果我移除水合物(假)或只是使用find($ id)我会回到Marquee,但是那么最好的方法是用问题文件来水化选框吗?这似乎很快就会变得毛茸茸,因为那时似乎文档上的任何引用都需要手动补充(因为我不认为odm将递归地执行)并且保持这是一个问题。我已经阅读了关于素数(真实)方法的内容,但我一定不能正确使用它,因为即使在启动后我仍然只能获得refid。

如果我使用prime(true),这将迫使我进行迭代,除非我还缺少其他东西。

$problems = $marquees->getProblems();
    foreach($problems as $problem) {
        var_dump($problem);die();
    }

我是否需要手动补充所有这些,或者是否有某种方式比这更好。我遵循标准1路线到1资源。因此,即使我想使用带有find($ id)的选取框的问题数据,我也不会在选取框路线上更新问题。相反,计划是使用问题路线来更新问题。这仅适用于find($ id)路由的显示数据。任何帮助表示赞赏

0 个答案:

没有答案