ОБНОВЛЕНИЕ ОЧИСТКИ: отношение с самоссылкой не работает с datamapper в codeigniter - PullRequest
0 голосов
/ 10 апреля 2011

Я прочитал документацию несколько раз.

Это структура таблицы:

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. Новая категория автоматически увеличивается до таблицы категорий и получает значения для полей контроллера, user_id, enabled_comments, передаваемых из строки запроса http-запроса через форму php
  3. Поиск в существующей категории (назовем ее родительской, но на самом деле нигде не упоминается родительская категория в базе данных)
  4. Новая запись записывается в таблицу category_related_categories, где category_id ссылается на первичный ключ новой созданной категории, а related_category_id ссылается на идентификатор существующей категории, которую мы искали. Следовательно, мы создаем отношения со многими ссылками, в которых подкатегория может иметь много категорий, а родительская категория может иметь много подкатегорий
  5. В категории может быть много зон, а в зоне может быть много категорий. У пользователя есть возможность выбрать одну или несколько зон из выпадающего списка. Например, если пользователь выбирает две зоны (каждая из которых имеет имя с использованием поля имени, такого как «главная» или «панель»), то, когда новая категория записывается в базу данных, не только родительская категория устанавливается с ней в таблица 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/

1 Ответ

0 голосов
/ 30 сентября 2011

Я знаю, что это старый вопрос, но я постараюсь помочь кому-нибудь еще с этим вопросом.

Когда вы сохраняете несколько отношений, вы можете (и должны использовать отношения со ссылками на себя) использовать relationship_key, который вы определили в модели как ключ в массиве:

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

Посмотрите внизу этой страницы документы и пример: http://datamapper.wanwizard.eu/pages/save.html

...