Я прочитал документацию несколько раз.
Это структура таблицы:
categories:
id controller user_id approved enabled_comments
categories_related_categories
id category_id related_category_id
categories_zones
id category_id zone_id
Это мои ожидания:
Я пытаюсь сохранить несколько отношений:
Ожидания:
- Создана новая запись категории (давайте назовем ее подкатегорией, но в действительности подкатегория не упоминается в базе данных)
- Новая категория автоматически увеличивается до таблицы категорий и получает значения для полей контроллера, user_id, enabled_comments, передаваемых из строки запроса http-запроса через форму php
- Поиск в существующей категории (назовем ее родительской, но на самом деле нигде не упоминается родительская категория в базе данных)
- Новая запись записывается в таблицу category_related_categories, где category_id ссылается на первичный ключ новой созданной категории, а related_category_id ссылается на идентификатор существующей категории, которую мы искали. Следовательно, мы создаем отношения со многими ссылками, в которых подкатегория может иметь много категорий, а родительская категория может иметь много подкатегорий
- В категории может быть много зон, а в зоне может быть много категорий. У пользователя есть возможность выбрать одну или несколько зон из выпадающего списка. Например, если пользователь выбирает две зоны (каждая из которых имеет имя с использованием поля имени, такого как «главная» или «панель»), то, когда новая категория записывается в базу данных, не только родительская категория устанавливается с ней в таблица category_related_categories, но множество для многих устанавливается в таблице category_zones, где создаются две записи (если пользователь выбирает две опции из множественного выбора), одна запись имеет первичный ключ новой категории, а одна запись зоны выбирается из множественного выбора и вторая запись снова имеет первичный ключ новой категрии с записью другой зоны, выбранной из множественного выбора.
Итак, подкатегория имеет отношение к родителю и зоне (ам):
Это код:
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);
}
Я получаю следующую ошибку с приведенным выше кодом (хотя таблица category_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));
Это запишет в таблицу category_related_categories, но не в таблицу category_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/