缺少列
没有名为的列heading
在你的articles
table.
外键配置无效
你的配置看起来有问题,targetForeignKey
is for BelongsToMany
协会,以及article_id
(另一个表的主键)是not中的外键Topic hasMany Comment
协会,就是topic_id
,并且当您遵循命名约定时没有必要指定它。
因此,当指定外键时,它应该看起来像这样:
class ArticlesTable extends Table {
public function initialize(array $config) {
$this->primaryKey('article_id');
$this->belongsTo ( 'Topics', [
'foreignKey' => 'topic_id'
]);
}
}
class TopicsTable extends Table {
public function initialize(array $config) {
$this->primaryKey('topic_id');
$this->hasMany ( 'Articles', [
'foreignKey' => 'topic_id'
]);
}
}
如果您坚持约定并命名主键,您可以避免很多混乱id
.
See also
- Cookbook > 模型 > 表对象 > 基本用法
- Cookbook > 模型 > 表对象 > HasMany 关联
可能缺少辅助功能配置
由于您正在尝试保存非默认字段(即Topic
数据而不是Topic
主键),您必须通过以下方式使该字段可访问以进行批量分配newEntity
。例如,这可以通过Entitiy::$_accessible
属性,该属性对于该实体的每个实例都是永久的,直到在运行时被覆盖
class Article extends Entity {
protected $_accessible = [
// ...
'topic' => true
];
}
或通过使用accessibleFields
选项Table::newEntity()
,仅适用于该单个实例。
$article = $articles->newEntity($this->request->data, [
'accessibleFields' => [
'topic' => true
]
]);
See also
- Cookbook > 模型 > 实体 > 质量分配
- API > Cake\ORM\Table::newEntity()
字段命名约定
最后,您的表单数据格式不正确,名称默认应为小写并带下划线,以便与实体属性匹配,并且它们应该是单数(除非它是hasMany
or belongsToMany
关联),即应该是article
and topic
代替Articles
and Topics
,实际上也没有必要使用article
at all.
echo $this->Form->input('heading');
echo $this->Form->input('topic.topic_title');
<input type="text" name="heading">
<input type="text" name="topic[topic_title]">
也可以看看Cookbook > Helpers > FormHelper > 字段命名约定