一对多 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(通过匹配表)的主要内容,如果未能解决你的问题,请参考以下文章