2013-06-10 9 views
6

今日、すべてがOKになるまで私は、Symfony2のとMongoDBのを使用していますが、私は、新しい文書を作成し、突然、このエラーが表示されます:

「MongoException:長さゼロのキーが許可されていませんが、あなたをしました二重引用符で$を使用しますか? "

$dm = $this->get('doctrine.odm.mongodb.document_manager'); 
$_repo = $dm->getRepository('CantaoCustomerBundle:CustomerTags'); 
$_repo->findOneByCustomer($customer); 

それはOKだ$customer、リポジトリは空で、私の文書クラスは、このようなものです:

/** 
    * @MongoDB\ID 
    **/ 
    private $id; 

    /** 
    * @MongoDB\ReferenceOne(targetDocument="Tapronto\Mats\ProductBundle\Document\Tag", cascade={"persist"}) 
    **/ 
    private $tag; 

    /** 
    * @MongoDB\ReferenceOne(targetDocument="Tapronto\Mats\CustomerBundle\Document\Customer", cascade={"persist"}) 
    **/ 
    private $customer; 

    /** 
    * @MongoDB\Float 
    **/ 
    private $points; 

    /** 
    * @MongoDB\Int 
    **/ 
    private $viewed; 

    /** 
    * @MongoDB\Int 
    **/ 
    private $brought; 

    /** 
    * @MongoDB\Int 
    **/ 
    private $favorited; 

    /** 
    * @MongoDB\Date 
    * @Gedmo\Timestampable(on="create") 
    **/ 
    private $createdAt; 

    /** 
    * @MongoDB\Date 
    * @Gedmo\Timestampable(on="update") 
    **/ 
    private $updatedAt; 

誰も私を助けることができる、いくつかのアイデアを持って、私はすべてを試してみましたが、何もいないようにみえ仕事

+0

それが埋め込まれた文書ですか? –

+0

いいえ、そうではありません。理論的には、この文書は顧客とタグの関係を作りますが、埋め込まれていません。 –

答えて

5

オブジェクトのプライベート属性を永続化しようとしている可能性があります。

これが当てはまらない場合は、長さ0のキーチェックをシャットダウンし、mongoに書き込まれている内容を確認して実際にデバッグできるようにするのが良い方法です。

ゼロ長キーは使用できません。二重引用符で$を使用しましたか?

コード:1

あなたはキーとして "" 保存しようとしました。あなたは一般的にこれを行うべきではありません。サブオブジェクトへのアクセスを混乱させる可能性があり、内部的にMongoDBによって使用されます。しかし、本当に必要なら、php.iniファイルでmongo.allow_empty_keysをtrueに設定して、このサニティチェックを無効にすることができます。これをオーバーライドする場合は、文字列補間エラーを避けるために、エラーチェックをstrictに設定することを強くお勧めします。

http://php.net/manual/en/mongo.configuration.php#ini.mongo.allow-empty-keys

5

私はこれを、参照オブジェクト自体ではなく参照オブジェクトのIDを検索用語として使用してこれを修正しました。

$_repo->findOneByCustomer($customer->getId()); 

EDIT:例外がスローされていませんが、それは実際にどちらか何かを返すされていません 。私はいくつかの場所(Doctrine MongoDB find by id)を提案したように、新しいMongoId($ id)を使ってみましたが、それもうまくいきませんでした。最後に、参照で検索する完全なクエリビルダで何かを見つけました(注:これはオブジェクトIDの代わりにオブジェクトを使用します)。 (あなたはもともと行ったように)

$dm->createQueryBuilder()->find('CantaoCustomerBundle:CustomerTags') 
         ->field('customer')->references($customer) 
         ->getQuery()->execute(); 

私はこのように感じるが、より簡単に行うべきであるが、この修正プログラムは、私のために働いています。

関連する問題