一对多 CakePHP3(通过匹配表)

Posted

技术标签:

【中文标题】一对多 CakePHP3(通过匹配表)【英文标题】:One to many CakePHP3 (via matching table) 【发布时间】:2017-06-26 10:54:48 【问题描述】:

我想知道,是否可以通过数据库中的匹配表 在 Cakephp3 中创建 OneToMany 关系。 这就是我的数据库的样子: Showcase of DB Schema

这是我的 ItemA 表:

    $this->belongsTo('ItemB', [
        'foreignKey' => 'item_a_id',
        'targetForeignKey' => 'item_b_id',
        'joinTable' => 'item_a_item_b'
    ]);

这是我的 ItemB 表:

    $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 Schema 的正确实现吗?我必须使用“通过”选项吗?我很困惑...

Edit#1:如果我用belongsToMany 而不是belongsTo 配置ItemA,它会起作用。但这将是多对多关系。

【问题讨论】:

【参考方案1】:

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

tbl_item_b.item_a_id

但是,听它的声音你已经知道了。就个人而言,我认为您的设置没有任何问题,只要记录在案(供将来的其他人使用)。

根据它的声音。您遇到的问题不在于数据库,而在于客户端渲染。您将要使用 select FormHelper 函数:

echo $this->Form->select(/*field name*/, /*[options]*/)

【讨论】:

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

以上是关于一对多 CakePHP3(通过匹配表)的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:在一对多关系中匹配多个项目的组合

057:表关系之一对多

excel如何实现一对多查询

excel怎么一对多匹配

Excel怎样实现一对多匹配?请教

MyBatis高级篇 - 关联查询(一对多)