基本的なブログアプリケーションには、関連するカテゴリを選択できる記事モジュールがあります。3つのテーブルがあります。記事、article_categories、categories。2つのモデル、Model_Article
およびModel_Category
それに応じて割り当てられたhas-many'through'関係を使用してORMを拡張します。「記事の編集」フォームの送信中に、次の適切な方法(またはより良い方法)は何ですか。
category ids
配列形式で利用可能なすべてを取得してデータを入力しますForm::select()
- ピボットテーブルから割り当てられ
category ids
たものを、選択したカテゴリの配列形式で取得します - いくつかのピボットデータがすでに存在する場合、フォームの送信が成功したらピボットテーブルを更新します。できれば、関連するデータを追加/削除する前に既存のデータを確認してください(既存のピボットデータをすべて削除してから、送信されたすべてのデータを追加するのではありませ
category ids
ん)。
基本的に、ORMオブジェクトをループせずにピボットデータ配列を取得する方法があることを望んでいます。
私が求めていることがデータベースプリペアドステートメント/クエリビルダーを介してのみ実行できるかどうかはわかりません。もしそうなら、私自身のメソッド(プリペアドステートメント/クエリビルダーを使用)を自分に追加することをお勧めしますModel_Article extend ORM
か?
私が使用している現在の方法は次のとおりです。
すべてのカテゴリIDを取得する
$categories_orm = ORM::factory('article_category')->find_all();
foreach($categories_orm as $category_orm) {
$categories[$category_orm->id] = $category_orm->name;
}
選択したカテゴリIDを取得する
$categories_current = $article->article_categories->find_all();
foreach($categories_current as $category){
$categories_selected = $category->id;
}
カテゴリIDを更新する
$categories_orm = $article->article_categories->find_all();
$categories_existing = array();
foreach($categories_orm as $category){
$categories_existing[] = $category->id;
}
$categories_selected = $this->request->post('category');
$categories_to_remove = array_diff($categories_existing,$categories_selected);
$categories_to_add = array_diff($categories_selected,$categories_existing);
if(!empty($categories_to_remove)) {
$article->remove('article_categories', $categories_to_remove);
}
if(!empty($categories_to_add)) {
$article->add('article_categories', $categories_to_add);
}