gpt4 book ai didi

cakephp - 保存与 Cakephp 3 的关联

转载 作者:行者123 更新时间:2023-12-02 21:12:04 24 4
gpt4 key购买 nike

我在使用 CakePHP 3 和通过一项操作保存新实体及其关联时遇到问题。

在我看来,我按照文档中的建议进行操作。

这是我的 Controller :

$articles = TableRegistry::get('Articles');       
$article = $articles->newEntity($this->request->data);

if ($this->request->is('post')) {

$valid = $articles->validate($article, [
'associated' => ['Topics']
]);

if ( $valid ) {
$articles->save($article, [
'validate' => false,
'associated' => ['Topics']
]);
}
}

那是我的模型:

class ArticlesTable extends Table {   
public function initialize(array $config) {
$this->primaryKey('article_id');
$this->belongsTo ( 'Topics', [
'targetForeignKey' => 'topic_id'
]);
}
}

class TopicsTable extends Table {
public function initialize(array $config) {
$this->primaryKey('topic_id');
$this->hasMany ( 'Articles', [
'targetForeignKey' => 'article_id'
]);
}

这是我的数据库:

CREATE TABLE `articles` (
`article_id` int(11) NOT NULL AUTO_INCREMENT,
`topic_id` int(11) DEFAULT NULL,
PRIMARY KEY (`article_id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1;

CREATE TABLE `topics` (
`topic_id` int(11) NOT NULL AUTO_INCREMENT,
`topic_title` varchar(45) DEFAULT NULL,
PRIMARY KEY (`topic_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我的表格看起来像这样:

<input type="text" id="articles-heading" maxlength="45" required="required" name="Articles[heading]">
<input type="text" id="articles-topics-topic-title" list="topics" name="Articles[Topics][topic_title]">

我想创建一个包含所有关联的表单,并通过一个请求保存它。

最佳答案

缺少列

您的 articles 表中没有名为 heading 的列。

外键配置无效

您的配置看起来错误,targetForeignKey 用于BelongsToMany 关联,article_id(另一个表的主键)是 不是 Topic hasMany Comment 关联中的外键,而是 topic_id,当您遵循命名约定时,无需指定它。 p>

因此,在指定外键时,它应该看起来像这样:

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,则可以避免很多困惑。

另请参阅

可能缺少辅助功能配置

由于您尝试保存非默认字段(即 Topic 数据而不是 Topic 主键),因此您必须使该字段可供大众访问通过 newEntity 进行分配。例如,可以通过 Entitiy::$_accessible 属性实现这一点,该属性对于该实体的每个实例都是永久的,直到在运行时被覆盖

class Article extends Entity {
protected $_accessible = [
// ...
'topic' => true
];
}

或者使用 Table::newEntity()accessibleFields 选项,该选项仅适用于该单个实例。

$article = $articles->newEntity($this->request->data, [
'accessibleFields' => [
'topic' => true
]
]);

另请参阅

字段命名约定

最后,您的表单数据格式不正确,名称默认应为小写并带下划线,以便与实体属性匹配,并且它们应该是单数(除非它是 hasManybelongsToMany 关联),即应该是 articletopic 而不是 ArticlesTopics,实际上也是根本没有必要使用article

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 > Field Naming Conventions

关于cakephp - 保存与 Cakephp 3 的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26328413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com