2017-05-11 7 views
1

すべての挿入または更新時にafterSaveメソッドでロジックを実装しました。Yii2 updateAll()がafterSave()をトリガーしない

ただし、updateAll()を使用した場所ではafterSaveは実行されません。

同じような代替手段はありますか?

+0

モデルを標準の 'save()'メソッドでループに保存します。問題は、それが遅く、より多くのメモリを消費することです。あるいは、可能であれば、 'afterSave()'のロジックを 'updateAll()'の後に単に呼び出すことのできる別のメソッドに移動してください。 – Bizley

+0

"updateAllの後の"メソッドを実装する方法は? –

答えて

2

afterSave()は、単一レコードと考えられます。 updateAll()は完全に異なる方法で多くのレコードを処理します。だからこの方法でafterSave()を使うことはできません。想像してみてください:このように何千ものレコードを更新すると、afterSave()のメソッドをレコードごとに実行する必要があります。afterSaveAll()のようなものが必要になります。

ActiveRecord::updateAll()に電話をしたときに、後で(すべての更新されたレコードに対して)何かが起こるようにするには、その呼び出し後に明示的に行う必要があります。あるいは、あなたはupdateAll()でやっていることを修正するかもしれません。それ以外の場合は、達成しようとしていることを詳細に教えてください。

また、Bizleyがコメントしたように、いくつかのレコードを更新しているだけのことを知っていれば、それをループで実行できます。だからupdateAll()を使用せず、save()の呼び出しと既に実装したafterSave()の暗黙の呼び出しを使って、各レコードを個別に更新します。あなたはそれを試すことができます、それはパフォーマンスの観点から許容されるかもしれません。

+1

あなたは正しいと私はコンセプトを持っているので、私は詳細を共有させてください、私に数分を与える –

関連する問題