Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php zf2条令odm并查询所有参考数据_Php_Mongodb_Doctrine Orm_Zend Framework2_Doctrine Odm - Fatal编程技术网

Php zf2条令odm并查询所有参考数据

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 { /** @

我不熟悉mongo和doctrine ODM,但不熟悉ORM。我有一个Marques文档和一个problems文档。我希望问题作为自己的收藏存在,但在保存字幕时能够将问题附加到字幕。然后,我希望能够通过其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并将水合设置为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,我看不出有什么大的区别,您会怎么做?