2013-06-10 27 views
6

Używam Symfony2 i MongoDB, aż do dzisiaj, wszystko jest OK, ale utworzyć nowy dokument i nagle pojawia się ten błąd:

„MongoException: Klucze zerowej długości nie są dozwolone, prawda używać $ z podwójnymi cudzysłowami? "

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

$customer jest OK, repozytorium jest pusta, a moja klasa dokument jest tak:

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

Czy ktoś może mi pomóc, mają jakiś pomysł, próbowałem wszystko i nic nie wydaje się praca

+0

Czy to jest osadzony dokument? –

+0

Nie, nie jest. Teoretycznie dokument ten tworzy relację między klientem a tagami .. ale nie jest osadzony. –

Odpowiedz

5

Możliwe, że próbujesz utrwalić prywatny atrybut obiektu.

Jeśli tak nie jest, dobrym sposobem na debugowanie jest wyłączenie sprawdzania klucza o zerowej długości, aby można było faktycznie debugować, sprawdzając, co jest zapisywane w mongo.

Klawisze o zerowej długości są niedozwolone, czy używałeś $ z podwójnymi cudzysłowami?

Kod: 1

Próbowałeś zapisać "" jako klucz. Zwykle nie powinieneś tego robić. "" może zepsuć dostęp do obiektu podrzędnego i jest używany wewnętrznie przez MongoDB. Jednakże, jeśli naprawdę chcesz, możesz ustawić plik mongo.allow_empty_keys na true w pliku php.ini, aby zastąpić kontrolę poprawności. Jeśli to zmienisz, zdecydowanie zaleca się, aby ustawić sprawdzanie błędów jako ścisłe, aby uniknąć błędów interpolacji napisów.

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

5

Naprawiłem to za pomocą identyfikatora obiektu, do którego się odnawiam, zamiast samego obiektu referencyjnego jako wyszukiwanego hasła.

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

EDIT: To nie rzuca wyjątek, ale to nie jest faktycznie powrocie nic albo. Próbowałem użyć nowego MongoId ($ id), ponieważ zasugerowano kilka miejsc (Doctrine MongoDB find by id), ale to też nie działało. Wreszcie znalazłem coś w pełnym konstruktorze zapytań, który wyszukuje przez referencje (uwaga: to używa obiektu zamiast identyfikatora obiektu).

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

czuję się jak należy to zrobić prościej (jak ty pierwotnie), ale ta poprawka jest praca dla mnie.