我对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)路由的显示数据。任何帮助表示赞赏