CLEARER UPDATE:自引用关系不能与codeigniter中的datamapper一起使用

时间:2011-04-10 03:29:47

标签: php codeigniter codeigniter-datamapper self-reference

我多次阅读documentation

这是表结构:

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 post请求的查询字符串传递的controller,user_id,enabled_comments字段赋值。
  3. 搜索现有类别(我们称之为父类别,但实际上数据库中没有提到父类别)
  4. 将新记录写入categories_related_categories表,其中category_id指的是创建的新类别的主键,related_category_id指的是我们搜索的现有类别的ID。因此,我们创建了多对多的自引用关系,其中子类别可以有许多类别,父类别可以有许多子类别
  5. 类别可以包含多个区域,区域可以包含多个类别。用户可以选择从多选下拉列表中选择一个或多个区域。例如,如果用户选择两个区域(每个区域都使用名称字段,如'main'或'panel'),那么当新类别写入数据库时​​,不仅是在其中建立了父类别categories_related_categories表,但在categories_zones表中建立了多对多,其中创建了两个记录(如果用户从multiselect中选择两个选项),一个记录具有新类别的主键,其中一个区域记录选自多选并且第二个记录再次具有新cateogry的主键,其中从多选中选择了另一个区域记录。
  6. 所以这是与父母和区域有关系的子类别:

    这是代码:

    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/

1 个答案:

答案 0 :(得分:0)

我知道这是一个老问题,但我会尝试用这个问题帮助其他人。

当您保存多个关系时,您可以(并且必须在自引用关系中)使用您在模型中定义的relationship_key作为数组中的键:

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

请查看本页底部的文档和示例: http://datamapper.wanwizard.eu/pages/save.html