【问题标题】:Symfony2 Mongodb : save object into anotherSymfony2 Mongodb:将对象保存到另一个
【发布时间】:2015-02-08 10:00:33
【问题描述】:

我正在使用 Symfony2 和 mongodb 和教义-odm,它们有一个奇怪的行为。我有一个 importFile 文档和一个上下文文档。上下文文档被引用到 importFile 之一,如下所示:

/**
* @MongoDB\Document
*/
class ImportFile
{
[...]
/**
 * @MongoDB\ReferenceOne(targetDocument="Contexte")
 */
private $contexte;

(getter 和 setter 都可以)。

我的上下文文档已经存在,并且存在于会话中。如果我转储上下文对象,我确实拥有所有必需的对象信息、他的 id 和他的所有属性。

在我的控制器中,我想将此上下文对象保存到我的 importFile 之一:

$dm = $this->getDocumentManager();
$importFile->setContexte($contexte); // contexte object already exists and persisted
$dm->persist($importFile);
$dm->flush();

它看起来很简单,应该像那样工作,但是在刷新时,我得到一个 mongodb 错误:

无法创建没有标识符的 DBRef。 UnitOfWork::getDocumentIdentifier() 没有返回类 Contexte 的标识符

我不知道我做错了什么。有什么帮助吗?

【问题讨论】:

    标签: mongodb symfony odm


    【解决方案1】:

    你没有做过 var_dump($importFile) 可能当你检索对象时,它只是空

    【讨论】:

      【解决方案2】:

      也许它会对某人有所帮助。

      在我的情况下,主要问题是验证后 ZF2 返回空字符串作为标识符。

      Doctrine 仅在默认值为 NULL https://github.com/doctrine/mongodb-odm/blob/master/lib/Doctrine/ODM/MongoDB/UnitOfWork.php#L1017 时生成新标识符。

      我的代码的简化示例(参见 cmets):

      namespace Ageme\Project\Controller;
      
      use Zend\Mvc\Controller\AbstractActionController;
      use Zend\View\Model\ViewModel;
      use Doctrine\ODM\MongoDB\DocumentManager;
      
      class ProjectController extends AbstractActionController {
      //...
      
          protected function saveAction() {
              /** @var DocumentManager $dm */
              $request = $this->getRequest();
              $route = $this->getEvent()->getRouteMatch();
      
              $sm = $this->getServiceLocator();
              $fm = $sm->get('FormElementManager');
              $dm = $sm->get('doctrine.documentmanager.odm_default');
      
              $project = ($project = $dm->find('Ageme\Project\Document\Project', $route->getParam('id')))
                  ? $project
                  : $sm->get('Ageme\Project\Document\Project');
      
              $form = $fm->get('Ageme\Project\Form\ProjectForm');
              $form->bind($project);
      
              if ($request->isPost()) {
                  $form->setData($request->getPost());
                  if ($form->isValid()) { 
                      // after validation $project->getId() === '', 
                      // but for new object must equal $project->getId() === null
                      $sm->get('ProjectService')->run('save', $project);
                      $this->flashMessenger()->addSuccessMessage('Project saved');
                      $this->redirect()->toRoute('default', 
                      ['controller' => $route->getParam('controller'), 'lang' => $route->getParam('lang')]
                      );
                  }
              }
      
              return new ViewModel([
                  'form' => $form,
              ]);
          }
          //...
      }
      

      我添加下一个过滤器来解决我的问题

      namespace Ageme\Project\Form;
      
      use Zend\Form\Fieldset;
      use Zend\InputFilter\InputFilterProviderInterface;
      
      use DoctrineModule\Persistence\ProvidesObjectManager;
      use DoctrineModule\Persistence\ObjectManagerAwareInterface;
      
      class ProjectFieldset 
          extends Fieldset 
          implements InputFilterProviderInterface, ObjectManagerAwareInterface {
      
          use ProvidesObjectManager;
      
          public function init() {
              $this->setName('project')
                  ->setAttributes(['id' => 'project']);
      
              $this->add([
                  'type' => 'Zend\Form\Element\Hidden',
                  'name' => 'id'
              ]);
              //...
          }
      
          public function getInputFilterSpecification() {
              return [
                  'id' => [
                      'required' => true,
                      'allow_empty' => true,
                      'filters' => [
                          [
                              "name" => "Callback",
                              "options" => [
                                   "callback" => function ($input) {
                                        return $input ?: null; // this code return correct value
                                   }
                               ]
                          ]
                      ],
                  ],
                  //...           
              ];
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-05-05
        • 1970-01-01
        • 2020-02-15
        • 2014-09-17
        • 1970-01-01
        • 1970-01-01
        • 2012-03-07
        • 2015-12-25
        • 2015-08-31
        相关资源
        最近更新 更多