Symfony2, Propel светильники и бетонное наследство
У меня проблема с загрузкой светильников Propel в Symfony2. У меня есть следующая схема:
<table name="application" phpName="Application">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
<column name="name" type="varchar" required="true" primaryString="true" />
<behavior name="timestampable" />
</table>
<table name="application_iphone" phpName="IphoneApplication">
<column name="store_id" type="varchar" required="true" />
<behavior name="concrete_inheritance">
<parameter name="extends" value="application" />
</behavior>
</table>
<table name="application_identifier" phpName="IphoneApplicationIdentifier">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
<column name="application_id" required="true" type="integer" />
<column name="identifier" type="varchar" required="true" primaryString="true" />
<foreign-key foreignTable="application_iphone">
<reference local="application_id" foreign="id" />
</foreign-key>
</table>
Модель строит правильно. Проблема возникает, когда я пытаюсь загрузить следующие приборы:
Acme\MyBundle\Model\Application:
first_app:
name: "MyFirstApp"
descendant_class: "IphoneApplication"
Acme\MyBundle\Model\IphoneApplication:
first_app_iphone:
id: first_app
store_id: 2342
Acme\MyBundle\Model\IphoneApplicationIdentifier:
first_app_identifier:
identifier: "com.acme.myfirstapp.appstore"
application_id: first_app_iphone
Возникает следующая ошибка:
[Propel] Исключение
Невозможно вставить значение для первичного ключа с автоинкрементом (application.ID)
Я добавил свое приложение "first_app" дважды (одно в приложении, другое в IphoneApplication), чтобы предотвратить другую проблему с моим устройством IphoneApplicationIdentifier:
[Propel] Исключение Объект "first_app" из класса "Acme\MyBundle\Model\Application" не определен в вашем файле данных.
Как я могу вставить приспособления для конкретной наследственной модели?
3 ответа
Propel сообщает, что вы пытаетесь установить значение для столбца автоинкремента, это связано с
id: first_app
линия.
Если я вас правильно понимаю, вы просто хотите добавить элемент приложения Iphone, верно? Если это так, вам просто нужно сделать:
Acme\MyBundle\Model\IphoneApplication:
first_app_iphone:
name: "MyFirstApp"
store_id: 2342
У меня была похожая ситуация, и в итоге у меня были разные файлы схемы. Для проверки одного - я удалил автоинкремент из схемы и определил другое место для хранения моделей. Это было давно, но общие шаги были такими:
Самосвальные приспособления для производственной среды
app/console propel:fixtures:dump
Соберите все необходимое для тестирования базы данных
app/console propel:database:create --env=test app/console propel:sql:build --env=test app/console propel:sql:insert --force --env=test app/console propel:model:build --env=test
Импортированные приборы в тестовую базу данных
app/console propel:fixtures:load --env=test
Обратите внимание, что команды могут отличаться в зависимости от версии Propel
Я нашел ошибку, объяснив мою проблему в деталях. Проблема не пришла из этого файла фикстур. Ошибка мне показалась мне странной. Почему об ошибке упоминается *first_app* вместо * iphone_first_app *?
Покопавшись в других файлах фикстур, я нашел забытую ссылку на *first_app*. Решение просто следующее (как упомянуто Карлосом Гранадосом):
Acme\MyBundle\Model\IphoneApplication:
first_app_iphone:
name: "My first app"
store_id: 2342
Acme\MyBundle\Model\IphoneApplicationIdentifier:
first_app_identifier:
identifier: "com.acme.myfirstapp.appstore"
application_id: first_app_iphone
Нет необходимости определять базовый класс.:)