1

Doctrine 2 で 2 つの MySQL テーブル間の関係をマッピングしようとしています。私の所有エンティティは「キャンペーン」で、「チャネル」に結合しています。

キャンペーン レコードを保存するときは、チャネル ID が含まれている必要があります。キャンペーンが取得されたら、この ID を使用してチャネルに参加し、(チャネル テーブルから) チャネル名を表示したいと考えています。これは 1 対 1 の一方向の関係だと思います。間違っていたら訂正してください。

テーブル関係

Doctrine 2 XML を使用してマッピングを次のように指定しました。

    <one-to-one field="channelId" target-entity="Channel" fetch="EAGER">
        <join-column name="channel_id" referenced-column-name="id" />
    </one-to-one>

キャンペーン エンティティを設定して永続化しようとすると、次のエラーが発生します。

永続操作をカスケードするように構成されていない関係を通じて、新しいエンティティが見つかりました: Mvc\Entity\Channel@0000000034b3dcd500000000cc77faae. 新しいエンティティを明示的に永続化するか、関係に対してカスケード永続化操作を構成します。

これをどのように保持するかを指定する必要があります。チャネル エンティティを変更または保存したくありません。「アソシエーション マッピング」に関する Doctrine 2 のドキュメントを調べましたが、これがどのように可能であるか理解できません。

ありがとうございました。

4

2 に答える 2

2

オブジェクトを永続化するときは、関連するすべてのオブジェクトも永続化する必要があります。この場合、キャンペーンを作成し、それをチャネルに関連付けます。Channel オブジェクトがまだ永続化されていない場合は、フラッシュを呼び出す前に永続化するか、関係に永続化カスケードを配置する必要があります。以下に 2 つのオプションを示します。

1) コードで、Campaign を永続化するときに、Channel も明示的に永続化します。

$em->perist($campaign);
$em->persist($campaign->getChannel());

2) Campaign::channel に持続カスケードを配置します。これにより、Channel オブジェクトが Campaign に関連付けられると、Channel オブジェクトが自動的に永続化されます。XMLの正確な構文はわかりませんが、試してみてください

<one-to-one field="channelId" target-entity="Channel" fetch="EAGER">
    <join-column name="channel_id" referenced-column-name="id" />
    <cascade><cascade-persist /></cascade>
</one-to-one>
于 2011-06-13T18:34:47.080 に答える
1

ここで同様の問題を抱えている人を見つけました。問題は、ChannelsテーブルへのキャンペーンXMLマッピングに2つの参照(channel_idとchannel_name)があったことでした。channel_idのみが必要であり、キャンペーンエンティティを永続化する前に、チャネルエンティティを作成してキャンペーンエンティティに割り当てる必要があります。

不思議なことに、Channelエンティティを個別に明示的に永続化する必要はありませんでした。私のキャンペーンXMLマッピングは次のようになります。

<one-to-one field="channelId" target-entity="ToastChannels" fetch="EAGER">
 <join-column name="channel_id" referenced-column-name="id" />
</one-to-one>

割り当ては次のようになります。

    $channelEntity = $this->_channelsDao->disableCache()->findObject($channelId]);
    $campaignEntity->setChannel($channelEntity);
    return $this->_campaignDao->save($campaignEntity);

DBレベルでは、チャネルIDのみが期待どおりにキャンペーンテーブルに保存されます。永続性ルールが指定されていないため、これがどのように可能かはまだわかりません。

于 2011-06-14T08:10:18.660 に答える