9

http://www.yesodweb.com/blog/2010/07/database-migrationsによるとDeleteCascade、数年前に型クラスが追加されました。これはモデルに追加することを意図しているとしか思えません。モデルの設定を次のように設定した後:

Field
    ...
    foreignId ForeignId DeleteCascade

私のアプリケーションは正常にコンパイルされます。ただし、DB スキーマは変更されず、削除もアプリケーションによってカスケードされません。手動で(身震いして)やるべきですか?より良い方法はありますか?

Yesod スキャフォールド (Application.hs、Foundation.hs、Settings.hs、...) を使用しています。

4

2 に答える 2

12

既存の回答を使用して、削除カスケードの使用方法を理解するのに時間がかかりました。Yesod の初心者として、私は Yesod の概要を知りませんでした。

機能する削除カスケードを取得するために、モデル内で何も変更する必要はありません。Entryエンティティ ファイルが次のようになっているとします。.

Entry
    title Text
Comment
    entry EntryId

このエンティティ ファイルを変更する必要はありません。

通常は でエンティティを導くコードはModel.hs、次のようになります。

share [ mkPersist sqlOnlySettings
      , mkMigrate "migrateAll" ]
    $(persistFileWith lowerCaseSettings "config/models")

mkDeleteCascade を追加して、エンティティの DeleteCascades インスタンスを取得します。

share [ mkPersist sqlOnlySettings
      , mkDeleteCascade sqlOnlySettings
      , mkMigrate "migrateAll" ]
    $(persistFileWith lowerCaseSettings "config/models")

たとえば、postDeleteEntryRHandler でエントリを削除したい場合は、削除の代わりにdeleteCascadeorを使用する必要があります。deleteCascadeWhere

runDB $ deleteCascade entryId

使用deleteすると、以前と同じ効果があります。

于 2014-07-12T10:40:35.150 に答える
4

DeleteCascade を利用するには、deleteCascade または deleteCascadeWhere 関数を使用する必要があります。これらは、タイプに使用できる DeleteCascade インスタンスがある場合にのみ機能します。これらを取得する最も簡単な方法は、mkDeleteCascade 関数を使用することです。

于 2012-09-16T09:28:02.833 に答える