Php 多对多关系保存失败

Php 多对多关系保存失败,php,mysql,orm,codeigniter-datamapper,Php,Mysql,Orm,Codeigniter Datamapper,我有这种多对多的关系: 这些是我的模型: Productvariant class Productvariant extends DataMapper { var $has_many = array('propertyvalue'); var $has_one = array('product'); } 属性值 class Propertyvalue extends DataMapper { var $has_many = array('productvaria

我有这种多对多的关系:

这些是我的模型:

Productvariant

class Productvariant extends DataMapper {

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

}
属性值

class Propertyvalue extends DataMapper {

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

}
控制器

消息

class Propertyvalue extends DataMapper {

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

}
我在文档中唯一能找到的是自我多对多关系,我似乎误解了他们希望你以那种方式使用模型

我是否也需要为额外的表定义一个模型

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

更新

我为多对多关系建立了中间模型

型号

控制器


它现在可以工作了,但是如果没有额外的
模型

您或者在Productvariant和Propertyvalue之间有一个多对多,然后您就可以像以前那样定义它们了。Datamapper将自动查找名为“productvariants\u propertyvalues”的连接表,其中包含两个表的外键

因此,您的设置应该可以正常工作。它们唯一可能弹出的问题是datamapper使用的CI plural()函数没有生成正确的表名,从而导致弹出not found错误

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


编辑:我现在看到您在表名前面加了一个双下划线。Datamapper将不会生成该数据,因此无法找到连接表。要么删除这些,要么切换到高级关系定义,在该定义中手动定义“联接表”。

感谢您的回复!我确实编辑了
Datamapper.php
config文件,以便为联接表使用这样的前缀。这是否意味着它不适用于M2M关系表?你能给我看一个演示吗?我正在尝试将所有联接表从“清理表”列表中移出。也许我应该使用类似于
zzz
?我现在完全删除了前缀,并从MySQL工作台重新定义了正向工程。一切似乎都检查出来了,但我仍然收到相同的错误通知的关系不工作。
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));