Php zf2条令odm并查询所有参考数据
我不熟悉mongo和doctrine ODM,但不熟悉ORM。我有一个Marques文档和一个problems文档。我希望问题作为自己的收藏存在,但在保存字幕时能够将问题附加到字幕。然后,我希望能够通过其id获取一个字幕,并将问题文档作为字幕中的数据Php zf2条令odm并查询所有参考数据,php,mongodb,doctrine-orm,zend-framework2,doctrine-odm,Php,Mongodb,Doctrine Orm,Zend Framework2,Doctrine Odm,我不熟悉mongo和doctrine ODM,但不熟悉ORM。我有一个Marques文档和一个problems文档。我希望问题作为自己的收藏存在,但在保存字幕时能够将问题附加到字幕。然后,我希望能够通过其id获取一个字幕,并将问题文档作为字幕中的数据 /** * Marquees * * @ODM\Document(collection="marquees", repositoryClass="MarqueesRepository") */ class Marquees { /** @
/**
* 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并将水合设置为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',
),
),
)
如果我删除了hydrate(false)或者仅仅使用find($id),我会得到一个字幕,但是用有问题的文档对字幕进行hydrate的最好方法是什么呢?这似乎很快就变得毛茸茸的,因为这样看来,文档上的任何引用都需要手动进行水合(因为我认为odm不会递归地进行),而维护这一点是一个问题。我已经读过prime(true)方法,但是我不能正确地使用它,因为即使在启动之后,我仍然只能返回ref id
如果我使用prime(true),这将迫使我也进行迭代,除非我缺少其他东西
$problems = $marquees->getProblems();
foreach($problems as $problem) {
var_dump($problem);die();
}
我是要手动给所有这些水补水,还是有比这更好的方法。我遵循一条标准的1路到1个资源。因此,即使我希望使用find($id)标记框的问题数据,我也不会更新标记路径上的问题。相反,计划是使用问题路径来更新问题。这仅用于在查找($id)路由上显示数据。非常感谢您的帮助如果您使用ORM,我看不出有什么大的区别,您会怎么做?