1

これには簡単な解決策があると確信していますが、何が起こっているのかわかりません。aPaymentと呼ばれるエンティティと、 と と呼ばれる他の 2 つのエンティティがUserありHouseholdます。

AUserには多くPaymentの があり、aHouseholdには多くPaymentの があります。これはすべて、このように YAML を使用する一方向の manyToOne 関係としてマップされます (うまくいけば、これはhttp://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/associationPaymentのガイダンスに沿ったものになります) -mapping.html#many-to-one-unidirectional ) -

Payment:
  type: entity
  table: payments
  id:
    _id:
      type: integer
      column: payment_id
      generator:
        strategy: AUTO
    manyToOne:
    _user:
      targetEntity: Application_Model_User
      joinColumn:
        name: user_id
        referencedColumnName: payment_id
    _household:
      targetEntity: Application_Model_Household
      joinColumn:
        name: household_id
        referencedColumnName: payment_id

データベースに関しては、 と の 3 つのテーブルがusersありpaymentsますhouseholds。テーブルには (そのpayments主キーに加えて) と という名前の 2 つの列がuser_idありhousehold_id、これらは他の 2 つのテーブルの主キーに対応しています。

問題は、新しいものを永続化しようとするとPayment、mySql からエラーが返され、のuser_id列をpaymentsnull にすることはできないということです。いくつかの掘り下げにより、教義がINSERT ステートメントのとnullの両方に提供されていることが確立されました。オブジェクトグラフは間違いなく正しいです。user_idhousehold_id

さらに、次の警告が表示されます。

Notice: Undefined index: payment_id in [..]/library/Doctrine/ORM/Persisters/BasicEntityPersister.php on line 511

Notice: Undefined index: in [..]/library/Doctrine/ORM/Persisters/BasicEntityPersister.php on line 511

Notice: Undefined index: payment_id in [..]/library/Doctrine/ORM/Persisters/BasicEntityPersister.php on line 511

Notice: Undefined index: in [..]/library/Doctrine/ORM/Persisters/BasicEntityPersister.php on line 511

問題の がマッピングの spayment_idから来ていること、およびインデックスが定義されていないことを立証しました。これは、配列ドクトリンが検索している関係の反対側、つまり 、またはからのフィールドが含まれているためです。でも、きっとそんなはずないですよね?ガイドに従ったと思いますが、うまくいきません。referencedColumnNameHouseholdUser

私はZend Frameworkを使用していますが、それが役立つ場合は、コードに特別なことは何もありません. マッピングの問題だと確信しています。

ありがとう

4

1 に答える 1

7

私はDoctrine+Symfony2のみを使用しましたが、外部キーの関係を説明する必要があるため、referencedColumnNameはpayment_idではなく「id」である必要があると思います。

payment.household_id--参照-> household.id

Symfony2には、Doctrineの「inversedBy」プロパティがあります。これは、payment_idを表す他のテーブルの列をマップするために使用されます。

Symfony2マッピングからのコードスニペット:

/**
* @ORM\ManyToOne(targetEntity="kurtfunai\WalkthroughBundle\Entity\Group", inversedBy="members")
* @ORM\JoinColumn(name="fk_group_id", referencedColumnName="id")
*/
protected $group;

あなたの場合、それは次のようなものに変更する必要があります:

_user:
  targetEntity: Application_Model_User
  joinColumn:
    name: user_id
    referencedColumnName: <USERS_TABLE_PRIMARY_KEY_COLUMN_NAME>
_household:
  targetEntity: Application_Model_Household
  joinColumn:
    name: household_id
    referencedColumnName: <HOUSEHOLDS_TABLE_PRIMARY_KEY_COLUMN_NAME>

(適切な列名に置き換えてください)

于 2012-07-05T14:57:54.057 に答える