Symfony2,推进固定装置和具体继承

时间:2012-08-07 15:12:42

标签: php symfony propel fixtures concrete-inheritance

我在Symfony2中加载Propel灯具时遇到了问题。我有以下架构:

<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

发生以下错误:

  

[推动]例外情况
  无法为自动增量主键(application.ID)插入值

我添加了两次“first_app”应用程序(一次在 Application 中,另一次在 IphoneApplication 中),以防止我的 IphoneApplicationIdentifier 出现另一个问题夹具:

  

[Propel] Exception类中的对象“first_app”   您的数据文件中未定义“Acme \ MyBundle \ Model \ Application”。

如何为具体的继承模型插入灯具?

3 个答案:

答案 0 :(得分:3)

Propel告诉您正在尝试为自动增量列设置一个值,这是由于

    id: first_app

线。

如果我理解正确,你只想添加一个Iphoneapplication项目,是吗?如果是这种情况,您只需要这样做:

Acme\MyBundle\Model\IphoneApplication:
    first_app_iphone:
        name: "MyFirstApp"
        store_id: 2342

答案 1 :(得分:1)

我有类似的情况,最终得到了不同的架构文件。为测试一个 - 我从架构中删除了自动增量,并为存储模型定义了另一个位置。很久以前,但一般步骤如下:


  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
    
  4. 请注意,该命令可能因Propel

    的版本而异

答案 2 :(得分:0)

我通过详细解释我的问题找到了错误。问题不是来自这个灯具文件。我的错误对我来说似乎很奇怪。为什么错误提到* first_app *而不是* iphone_first_app *?

在深入研究其他灯具文件后,我发现了对* first_app *的遗忘引用。解决方案简单如下(如Carlos Granados所述):

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

无需定义基类。 :)