0

ドキュメントを何度も読みました。

これはテーブル構造です:

categories:
id controller user_id approved enabled_comments

categories_related_categories
id category_id related_category_id

categories_zones
id category_id zone_id

これは私の期待です:

複数のリレーションを保存しようとしています:

期待:

  1. 新しいカテゴリ レコードが作成されます (これをサブカテゴリと呼びましょうが、実際にはデータベースで言及されているサブカテゴリはどこにもありません)
  2. 新しいカテゴリは、カテゴリ テーブルに自動インクリメントされ、php フォームを介して http ポスト リクエストのクエリ文字列から渡された controller、user_id、enabled_comments フィールドの値が与えられます。
  3. 既存のカテゴリが検索されます (これを親カテゴリと呼びましょうが、実際にはデータベース内で言及されている親カテゴリはどこにもありません)
  4. 新しいレコードは、categories_related_categories テーブルに書き込まれます。ここで、category_id は、作成された新しいカテゴリの主キーを参照し、related_category_id は、検索した既存のカテゴリの ID を参照します。したがって、サブカテゴリが多くのカテゴリを持つことができ、親カテゴリが多くのサブカテゴリを持つことができる、多対多の自己参照関係を作成します
  5. 1 つのカテゴリに複数のゾーンを含めることができ、1 つのゾーンに複数のカテゴリを含めることができます。ユーザーには、複数選択ドロップダウンから 1 つまたは複数のゾーンを選択するオプションがあります。たとえば、ユーザーが 2 つのゾーン (それぞれに「main」や「panel」などの名前フィールドを使用した名前が付いている) を選択した場合、新しいカテゴリがデータベースに書き込まれると、それで親カテゴリが確立されるだけでなく、 category_related_categories テーブルですが、categories_zones テーブルでは多対多が確立され、そこで 2 つのレコードが作成されます (ユーザーが複数選択から 2 つのオプションを選択した場合)。1 つのレコードには、複数選択から選択された 1 つのゾーン レコードを持つ新しいカテゴリの主キーがあります。 2 番目のレコードには、複数選択から選択された他のゾーン レコードを含む新しいカテゴリの主キーが再び含まれます。

したがって、親およびゾーンと関係があるのはサブカテゴリです。

これはコードです:

public function create(){
        $vanity_url = new VanityUrl();
        $vanity_url->where('url',$this->uri->segment(2))->get();
        $blogger = new User();
        $blogger->where('id',$vanity_url->user_id)->get();

        /* self-referencing many to many */            
        $subcategory = new Category; //subcategory - we create a new one
        $subcategory->controller = $this->input->post('controller');
        $subcategory->enable_comments = $this->input->post('approved');
        $subcategory->user_id = $this->current_user()->id;

        $parent_category = new Category(); //parent category - we find via a search in the table
        $parent_category->where('controller',$this->input->post('parent_controller'))->get();
    //    $subcategory->save($parent_category);

        /* many to many - category has many zones :: zone has many categories */
        $zone = new Zone();
        $zones = $this->input->post('zones');

        foreach($zones as $z){
            switch($z){
                case 'main':
                    $zone->where('name',$z);
                    break;
                case 'panel':
                    $zone->where('name',$z);
                    break;
            }
        }
        $zone->get();

        $subcategory->save($parent_category,$zone);

    }  

上記のコードで次のエラーが発生します (ただし、categories_zones テーブルには書き込まれます)。

A PHP Error was encountered

Severity: Warning

Message: Illegal offset type in isset or empty

Filename: libraries/Datamapper.php

Line Number: 4151  

私はこれを試します:

$subcategory->save_relation($parent_category,$zone);  

しかし、私はこのエラーが発生します:

An Error Was Encountered

Unable to relate category with relation. 

次に、このリンクの例を試します: http://datamapper.wanwizard.eu/pages/save.html

$subcategory->save(array($parent_category,$zone));

これは、categories_related_categories テーブルには書き込みますが、categories_zones テーブルには書き込みません。

私のカテゴリとゾーンモデルにはこれが含まれています:

class Category extends DataMapper {
    var $has_one = array("user");

public $has_many = array(

        'related_category' => array(
            'class' => 'category',
            'other_field' => 'category',
           // 'reciprocal' => TRUE
        ),
        'category' => array(
            'other_field' => 'related_category',
        ),
        'post',
        'zone'
    );

}

class Zone extends DataMapper {
    var $has_many = array("category");
}

私の一時的な解決策は、最後のコメントです (現時点では): http://codeigniter.com/forums/viewthread/186054/

4

1 に答える 1

0

これは古い質問であることは知っていますが、この質問で他の人を助けようとします.

relationship_key複数のリレーションシップを保存する場合、モデルで定義したa を配列のキーとして使用できます (自己参照リレーションシップでは使用する必要があります) 。

$subcategory->save(
    array(
        'category' => $parent_category,
        'zone' => $zone
    )
);

ドキュメントと例については、このページの下部をご覧ください: http://datamapper.wanwizard.eu/pages/save.html

于 2011-09-30T19:37:31.547 に答える