3

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

次のエラーが発生します。

[Propel]例外
自動インクリメント主キー(application.ID)の値を挿入できません

IphoneApplicationIdentifierフィクスチャで別の問題が発生しないように、「first_app」アプリケーションを2回追加しました(1つはApplicationに、もう1つはIphoneApplicationに)。

[Propel]例外クラス「Acme\MyBundle \ Model\Application」のオブジェクト「first_app」がデータファイルに定義されていません。

具体的な継承モデルのフィクスチャを挿入するにはどうすればよいですか?

4

3 に答える 3

3

Propelは、自動インクリメント列の値を設定しようとしていることを通知しています。これは、

    id: first_app

ライン。

私があなたを正しく理解しているなら、あなたはただIphoneapplicationアイテムを追加したいだけです、そうですか?その場合は、次のことを行う必要があります。

Acme\MyBundle\Model\IphoneApplication:
    first_app_iphone:
        name: "MyFirstApp"
        store_id: 2342
于 2012-08-07T15:44:14.967 に答える
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
    

コマンドはPropelのバージョンによって異なる場合があることに注意してください

于 2012-08-07T15:21:43.093 に答える
0

問題を詳しく説明して間違いを見つけました。この問題は、このフィクスチャファイルから発生したものではありません。私が奇妙に思えたエラー。エラーが*iphone_first_app*ではなく*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

基本クラスを定義する必要はありません。:)

于 2012-08-07T16:11:38.927 に答える