多对多关系保存失败

时间:2013-10-20 18:27:30

标签: php mysql orm codeigniter-datamapper

我有这种多对多的关系:

M2M

这些是我的模特:

Productvariant

class Productvariant extends DataMapper {

    var $has_many = array('propertyvalue');
    var $has_one = array('product');

}

的PropertyValue

class Propertyvalue extends DataMapper {

    var $has_many = array('productvariant');
    var $has_one = array('property');

}

控制器

$productvariant = new Productvariant(1);
$prodval = new Propertyvalue(1);
$productvariant->save($prodval);

消息

Unable to relate productvariant with propertyvalue.

我在文档中只能找到自我多对多的关系,我似乎误读了他们希望你以这种方式使用模型的方式。

我是否还需要为额外的表定义模型?

==========================

更新

我为多对多关系创建了一个中间模型;

模型

class Productvariant_propertyvalues extends DataMapper {

    var $table = '__productvariants_propertyvalues';

    var $has_one = array('productvariant', 'propertyvalue');

}

控制器

$productvariant = new Productvariant(1);
$propval = new Propertyvalue(1);

$pv_vals = new Productvariant_propertyvalues();
$pv_vals->save(array($productvariant, $propval));

它现在有效,但如果没有额外的Model

,这不应该是可行的

1 个答案:

答案 0 :(得分:0)

您要么在Productvariant和Propertyvalue之间有多对多,那么就像您一样定义它们。 Datamapper将自动查找名为“productvariants_propertyvalues”的联结表,其中包含两个表的外键。

所以你的设置应该有效。它们只会发出可能弹出的问题,即datamapper使用的CI plural()函数不会产生正确的表名,导致弹出未找到的错误。

如果您创建一个中间模型,则将多对多分为两个一对多。没问题,但是否需要它取决于您的应用程序设计。

编辑:我现在看到你在表名前加上了一个双下划线。 Datamapper不会生成,因此无法找到联结表。删除它们,或切换到高级关系定义,您可以在其中手动定义“join_table”。

相关问题