ドキュメントを何度も読みました。
これはテーブル構造です:
categories:
id controller user_id approved enabled_comments
categories_related_categories
id category_id related_category_id
categories_zones
id category_id zone_id
これは私の期待です:
複数のリレーションを保存しようとしています:
期待:
- 新しいカテゴリ レコードが作成されます (これをサブカテゴリと呼びましょうが、実際にはデータベースで言及されているサブカテゴリはどこにもありません)
- 新しいカテゴリは、カテゴリ テーブルに自動インクリメントされ、php フォームを介して http ポスト リクエストのクエリ文字列から渡された controller、user_id、enabled_comments フィールドの値が与えられます。
- 既存のカテゴリが検索されます (これを親カテゴリと呼びましょうが、実際にはデータベース内で言及されている親カテゴリはどこにもありません)
- 新しいレコードは、categories_related_categories テーブルに書き込まれます。ここで、category_id は、作成された新しいカテゴリの主キーを参照し、related_category_id は、検索した既存のカテゴリの ID を参照します。したがって、サブカテゴリが多くのカテゴリを持つことができ、親カテゴリが多くのサブカテゴリを持つことができる、多対多の自己参照関係を作成します
- 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/