0

基本的なブログアプリケーションには、関連するカテゴリを選択できる記事モジュールがあります。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);
    }
4

1 に答える 1

0

articles_categoriesKohanaの規則に従うには、おそらく関係テーブルの名前を(両方とも複数形)に変更する必要がありますcategories。これは、関係のより適切なエイリアスです。

カテゴリモデルは、すべてのカテゴリIDを取得するために使用する必要があります。次に、例と同じようにループして、配列にデータを入力します。

すべてのカテゴリを取得します。

$categories_orm = ORM::factory('category')->find_all();
foreach ($categories_orm as $category)
{
    $categories[$categories_orm->id] = $categories_orm->name;   
}

次のように名前を付けて、select要素が配列内のpost値を与えることを確認してください。

name="categories[]"

関係を更新します。

$article = ORM::factory('article', $post['article_id']);

// do stuff (validate, update the article etc.)

// remove all relationships
$article->remove('categories');

// add new relationships
$article->add('categories', $post['categories']);

カテゴリの関係を更新する必要があるかどうかを最初に確認するために、非表示のフォームフィールドを使用してチェックします。記事のカテゴリが変わることはめったにないと思います。

于 2012-05-31T06:44:07.730 に答える