モデルにいくつかの変換動作を作成しようとしました。しかし、どうすれば特定の翻訳を削除できますか。
私の例は、翻訳する必要のある名前を持つカテゴリです。私が英語とスペイン語の翻訳を持っているとしましょう。スペイン語のtranslationshを削除するにはどうすればよいですか?offcouse私は自分のSQLクエリを作成することができましたが、それを行うためのcakephpの方法はありますか。
モデルにいくつかの変換動作を作成しようとしました。しかし、どうすれば特定の翻訳を削除できますか。
私の例は、翻訳する必要のある名前を持つカテゴリです。私が英語とスペイン語の翻訳を持っているとしましょう。スペイン語のtranslationshを削除するにはどうすればよいですか?offcouse私は自分のSQLクエリを作成することができましたが、それを行うためのcakephpの方法はありますか。
ただし、達成するのは簡単です
特定のロケールのすべての翻訳を削除するには(他の破壊的なアクションと同様に、何かを行う前にデータベースのバックアップを取り、間違いがあった場合や予期しないものが削除された場合に回復できるようにします):
DELETE FROM i18n WHERE locale = 'esp';
もちろん、ロケールは特定のアプリケーションによって異なります。構成を確認するか、dbに問い合わせることができます。
SELECT DISTINCT(locale) FROM i18n;
モデル条件を追加するだけです。
DELETE FROM i18n
WHERE
locale = 'esp' AND
model = 'Category'
;
操作するレコードのIDを知っている必要があります。次に、次のようにします。
DELETE FROM i18n
WHERE
locale = 'esp' AND
model = 'Category' AND
foreign_key = 2468789 AND
field = 'name'
;
データベースでクエリを直接実行することに自信がない場合は、最初にselectを実行して、削除する内容を確認してください。
SELECT * FROM i18n
WHERE
locale = 'esp' AND
model = 'Category' AND
foreign_key = 2468789 AND
field = 'name'
;
つまり、必要なものを見つけてSELECT
、をDELETE
ステートメントに変更するだけです。
驚いたことに、特定のエンティティの翻訳を削除するようなネイティブのCakePHPメソッドはありません。@ AD7sixは明らかに正しいですが、もっと「本ごとの」アプローチを紹介しましょう。
あなたはこのようにsthを行うことができます:
<a href="<?= $this->Url->build(['action' => 'deleteTranslation', 'foreign_key' => 123, 'model' => 'Pluginname.Controller', 'locale' => 'de_DE']); ?>"><?= __('Remove translation'); ?></a>
次に、その機能を利用するメソッドを作成します。
//put this into src/AppController.php to enable that functionality across the whole application
public function deleteTranslation() {
$this->loadModel('I18n');
if($this->I18n->deleteAll([
'locale' => $this->request->getQuery('locale'),
'model' => $this->request->getQuery('model'),
'foreign_key' => $this->request->getQuery('foreign_key')
])) {
$this->Flash->success(__('Successfully deleted a translation.'));
}
else {
$this->Flash->error(__('Could not delete a translation.'));
}
return $this->redirect($this->referer());
}