Mysql 一对多CakePHP3(通过匹配表)

Mysql 一对多CakePHP3(通过匹配表),mysql,orm,associations,cakephp-3.0,Mysql,Orm,Associations,Cakephp 3.0,我想知道,是否可以通过数据库中的匹配表在CakePHP3中创建一个OneToMany关系。 这就是我的数据库的外观: 这是我的ItemA表格: $this->belongsTo('ItemB', [ 'foreignKey' => 'item_a_id', 'targetForeignKey' => 'item_b_id', 'joinTable' => 'item_a_item_b' ]); 这是我的B

我想知道,是否可以通过数据库中的匹配表在CakePHP3中创建一个OneToMany关系。 这就是我的数据库的外观:

这是我的ItemA表格:

    $this->belongsTo('ItemB', [
        'foreignKey' => 'item_a_id',
        'targetForeignKey' => 'item_b_id',
        'joinTable' => 'item_a_item_b'
    ]);
这是我的B项表格:

    $this->belongsToMany('ItemA', [
        'foreignKey' => 'item_b_id',
        'targetForeignKey' => 'item_a_id',
        'joinTable' => 'item_a_item_b'
    ]);
但是,当我在模板中为ItemA创建控件时,它仍然会给我一个多重选择

echo $this->Form->control('item_b._ids', ['options' => $item_b, 'empty' => true]);
当我将此表单更改为单选时,所选对象将不会被传递。我一直坚持多重选择:(

这是Cake中DB模式的正确实现吗?我必须使用“通过”选项吗?我很困惑


编辑#1:如果我使用belongToMany而不是belongTo配置ItemA,它会起作用。但这将是一个多对多关系。

传统上,这不是构造一对多关系的方式。要在DB级别强制执行此操作,只需将
tbl_item_a.id
添加到
tbl_item_b
表中,如下所示:

tbl\u item\u b.item\u a\u id

然而,听上去你已经知道了这一点。就我个人而言,我认为你的设置没有任何问题,只要它被记录在案(为将来的其他人)

听上去,问题不在于数据库,而在于客户端渲染。为此,您需要使用
FormHelper
函数:


echo$this->Form->select(/*字段名*/,/*[选项]*/)

我知道它应该在没有匹配表的情况下进行设计。但是,配置而不是模板有问题,因为在ItemA中保存ItemB时,我看不到有关ItemB的任何信息。表和实体对象看起来像什么?我问这个问题是因为您可能需要“告诉cake”这是一个多对多关系,通过控制客户端输出来限制输入。我通过bake创建了它们。我在实体中没有做任何更改,在表中,我添加了关系,如上所示。我将两个表都更改为BelongToMany,并添加了$rules->validCount('itemB',1','select','multiple'=>false到模板中的$this->Form->control导致数据未正确保存的问题。请求数据中似乎没有itemB实体对象。