0 レビュー
1 回答
php-CLEARER UPDATE:自己参照関係がcodeigniterのdatamapperで機能していません
ドキュメントを数回読みました。
これはテーブル構造です:
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フォームを介してhttppostリクエストのクエリ文字列から渡されるcontroller、user_id、enabled_commentsフィールドの値が与えられます
- 既存のカテゴリが検索されます(これを親カテゴリと呼びますが、実際には、データベースで親カテゴリがどこに記載されているかはわかりません)
- 新しいレコードがcategories_related_categoriesテーブルに書き込まれます。ここで、category_idは作成された新しいカテゴリの主キーを参照し、related_category_idは検索した既存のカテゴリのIDを参照します。したがって、サブカテゴリに多くのカテゴリを含めることができ、親カテゴリに多くのサブカテゴリを含めることができる、多対多の自己参照関係を作成します。
- カテゴリには多くのゾーンを含めることができ、ゾーンには多くのカテゴリを含めることができます。ユーザーは、複数選択ドロップダウンから1つまたは複数のゾーンを選択するオプションがあります。たとえば、ユーザーが2つのゾーンを選択した場合(それぞれに「main」や「panel」などの名前フィールドを使用した名前が付けられます)、新しいカテゴリがデータベースに書き込まれると、親カテゴリだけでなく、カテゴリ_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));
THatは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/
わからない
0
レビュー
答え :
解決策:
これは古い質問だと思いますが、この質問で他の人の手助けをしようと思います。
複数の関係を保存する場合、モデルで定義した relationship_key
を配列のキーとして使用できます(自己参照関係である必要があります)。< / p>
$subcategory->save(
array(
'category' => $parent_category,
'zone' => $zone
)
);
ドキュメントと例については、このページの下部をご覧ください。 http://datamapper.wanwizard.eu/pages/save.html
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。