[Doctrine2] Klucz obcy w encji., Single id is not allowed on composite primary key in entity |
[Doctrine2] Klucz obcy w encji., Single id is not allowed on composite primary key in entity |
5.11.2014, 14:14:54
Post
#1
|
|
Grupa: Zarejestrowani Postów: 186 Pomógł: 18 Dołączył: 2.09.2010 Ostrzeżenie: (0%) |
Mam dwie encje:
oraz:
Oraz kontroler:
I otrzymuję błąd: Kod Fatal error: Uncaught exception 'Doctrine\ORM\Mapping\MappingException' with message 'Single id is not allowed on composite primary key in entity Album\Entity\Song' in D:\xampp1.8.2\htdocs\testy\DoctrineCompositeForeignKey\vendor\doctrine\orm\lib\Doctrine\ORM\Mapping\MappingException.php on line 414 Czy to ja robię coś źle? Czy to jakieś dziwne ograniczenie doctrine? Ten post edytował ghost1511 5.11.2014, 14:15:44 |
|
|
5.11.2014, 19:23:17
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) |
Encja Song ma złożony klucz główny (przyjrzyj się @ORM\Id) i jest identyfikowana przez title i album jednocześnie.
Nie jestem pewien, czy to celowy zabieg, czy może pomyłka. |
|
|
5.11.2014, 20:05:50
Post
#3
|
|
Grupa: Zarejestrowani Postów: 186 Pomógł: 18 Dołączył: 2.09.2010 Ostrzeżenie: (0%) |
Zabieg celowy. Wg dokumentacji jest to możliwe:
http://doctrine-orm.readthedocs.org/en/lat...imary-keys.html Jednak wygląda na to, że robię coś źle. Nie potrafię jednak stwierdzić co. Ten post edytował ghost1511 5.11.2014, 20:12:36 |
|
|
5.11.2014, 20:41:22
Post
#4
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) |
Skoro jest to zabieg celowy, to konstruktor encji Song powinien wyglądać tak:
Natomiast podczas tworzenia obiektu Song powinieneś podać zarówno jego title, jak i Album, do którego Song jest przypisany:
Nie jestem pewien, czy hydrator Doctrine poradzi sobie z tym, gdyby jednak miał, to trzeba to uwzględnić w pętli foreach:
Mamy tutaj takie małe "błędne" koło. Ten post edytował mortus 5.11.2014, 20:42:05 |
|
|
6.11.2014, 08:18:46
Post
#5
|
|
Grupa: Zarejestrowani Postów: 186 Pomógł: 18 Dołączył: 2.09.2010 Ostrzeżenie: (0%) |
Wprowadziłem Twoje zmiany i jednak nie pomogło. Wygląda na to, że nie tutaj leży problem. Już na etapie uruchamiania Doctrine pojawia się ten problem:
Kod Fatal error: Uncaught exception 'Doctrine\ORM\Mapping\MappingException' with message 'Single id is not allowed on composite primary key in entity Album\Entity\Song' in D:\xampp1.8.2\htdocs\testy\DoctrineCompositeForeignKey\vendor\doctrine\orm\lib\Doctrine\ORM\Mapping\MappingException.php on line 414
( ! ) Doctrine\ORM\Mapping\MappingException: Single id is not allowed on composite primary key in entity Album\Entity\Song in D:\xampp1.8.2\htdocs\testy\DoctrineCompositeForeignKey\vendor\doctrine\orm\lib\Doctrine\ORM\Mapping\MappingException.php on line 414 Call Stack # Time Memory Function Location 1 0.0007 137544 {main}( ) ..\index.php:0 2 0.3081 5281208 Zend\Mvc\Application->run( ) ..\index.php:17 3 0.3206 5421056 Zend\Mvc\Application->completeRequest( ) ..\Application.php:327 4 0.3649 6199776 Zend\EventManager\EventManager->trigger( ) ..\Application.php:353 5 0.3649 6199904 Zend\EventManager\EventManager->triggerListeners( ) ..\EventManager.php:207 6 0.3656 6204744 call_user_func:{D:\xampp1.8.2\htdocs\testy\DoctrineCompositeForeignKey\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php:468} ( ) ..\EventManager.php:468 7 0.3656 6204760 ZendDeveloperTools\Listener\ProfilerListener->onFinish( ) ..\EventManager.php:468 8 0.4202 8005080 ZendDeveloperTools\Profiler->collect( ) ..\ProfilerListener.php:107 9 0.4278 8103200 DoctrineORMModule\Collector\MappingCollector->collect( ) ..\Profiler.php:211 10 0.4279 8103256 Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->getAllMetadata( ) ..\MappingCollector.php:97 11 0.4776 8772984 Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor( ) ..\AbstractClassMetadataFactory.php:114 12 0.4776 8773016 Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata( ) ..\AbstractClassMetadataFactory.php:211 13 0.4777 8775936 Doctrine\ORM\Mapping\ClassMetadataFactory->doLoadMetadata( ) ..\AbstractClassMetadataFactory.php:318 14 0.4825 8801744 Doctrine\ORM\Mapping\ClassMetadataFactory->completeIdGeneratorMapping( ) ..\ClassMetadataFactory.php:140 15 0.4825 8801808 Doctrine\ORM\Mapping\ClassMetadataInfo->getSingleIdentifierFieldName( ) ..\ClassMetadataFactory.php:451 |
|
|
6.11.2014, 12:33:24
Post
#6
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) |
Problem zapewne pojawia się w tym miejscu:
Korzystamy tutaj z tablicy $killEmAllData, w której songs identyfikowane są jedynie przez title. Trzeba by było zatem zmienić strukturę danych:
Nie jestem również pewien kolejności wykonywanych działań. Wg dokumentacji https://github.com/doctrine/DoctrineModule/...any-association, najpierw należałoby utworzyć tablicę obiektów Song (jeśli takowe encje w bazie danych nie istnieją), a dopiero później można użyć hydratora, przy czym kolekcja $songs zostanie wypełniona automatycznie. Wtedy kod wyglądałby tak:
Przyjrzyj się dokładniej dokumentacji, którą możesz znaleźć pod odnośnikiem powyżej, bowiem Example 3 opisuje podobny przypadek, z tym, że Ty używasz klucza złożonego w połączeniu z kluczem obcym. |
|
|
6.11.2014, 14:55:06
Post
#7
|
|
Grupa: Zarejestrowani Postów: 186 Pomógł: 18 Dołączył: 2.09.2010 Ostrzeżenie: (0%) |
Problemem nie są dane. Kontroler się nawet nie uruchamia. Doctrine podczas uruchamiania sprawdza powiązania encji i wtedy rzuca błędem, zresztą widać to na Call Stacku który wrzuciłem.
Przykład który podałeś jest bez @ID, które wszystko komplikuje. Spójrz jeszcze raz w dokumentację http://doctrine-orm.readthedocs.org/en/lat...oreign-entities. Cytat The semantics of mapping identity through foreign entities are easy: Only allowed on Many-To-One or One-To-One associations. To chyba odpowiedz na moje pytanie. Jest sposób obejścia tego problemu. Nie jest on może tak elegancki jak hydrator. Ale też zgrabny:
Chyba, że ktoś jednak wie jak to ominąć. Wygląda na to, że Doctrine nie radzi sobie ze złożonymi kluczami obcymi. |
|
|
Wersja Lo-Fi | Aktualny czas: 25.04.2024 - 16:40 |