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

У меня была похожая ситуация, и в итоге у меня были разные файлы схемы. Для проверки одного - я удалил автоинкремент из схемы и определил другое место для хранения моделей. Это было давно, но общие шаги были такими:


  1. Самосвальные приспособления для производственной среды

    app/console propel:fixtures:dump
    
  2. Соберите все необходимое для тестирования базы данных

    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
    
  3. Импортированные приборы в тестовую базу данных

    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

Нет необходимости определять базовый класс.:)

Другие вопросы по тегам