use*_*360 3 cakephp cakephp-3.0
我正在创建一个博客,我希望能够为一篇文章分配多个类别或标签,而一篇文章可以有多个类别.
这就是我在我的数据库中所拥有的:文章,类别和连接表articles_categories.
项目:

加入表:

在我的表/ ArticlesTable.php中:
public function initialize(array $config)
{
$this->addBehavior('Timestamp');
$this->belongsToMany('Categories', [
'alias' => 'Categories',
'foreignKey' => 'article_id',
'targetForeignKey' => 'category_id',
'joinTable' => 'articles_categories'
]);
}
Run Code Online (Sandbox Code Playgroud)
在我的表/ CategoriesTable.php中:
public function initialize(array $config)
{
$this->table('categories');
$this->displayField('name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsToMany('Articles', [
'alias' => 'Articles',
'foreignKey' => 'category_id',
'targetForeignKey' => 'article_id',
'joinTable' => 'articles_categories'
]);
}
Run Code Online (Sandbox Code Playgroud)
当用户添加文章时,它需要添加文章,然后在连接表中的ids是我的ArticlesController/add方法:
public function add()
{
$article = $this->Articles->newEntity();
if ($this->request->is('post'))
{
$article = $this->Articles->patchEntity($article, $this->request->data);
$article->user_id = $this->Auth->user('id');
if ($result = $this->Articles->save($article))
{
$this->Flash->success(__('Your article has been saved.'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('Unable to add your article.'));
}
$this->set(['article'=>$article,'buttontext'=>'Add Article']);
$categories = $this->Articles->Categories->find('list');
$this->set(compact('categories'));
}
Run Code Online (Sandbox Code Playgroud)
add.ctp视图:
Run Code Online (Sandbox Code Playgroud)echo $this->Form->create($article, ['class' => 'form-group']); echo $this->Form->input('articlecategory',['options' => $categories,'id'=>'magicselect','multiple'=>true,'class'=>'form-control']); echo $this->Form->input('title', ['class'=>'form-control', 'maxlength'=>'50']); echo $this->Form->input('body', ['rows' => '8', 'class'=>'form-control', 'style'=>'margin-bottom:10px;resize: none', 'maxlength'=>'5000']); echo $this->Form->button(__($buttontext), ['class'=>'btn btn-success']); echo $this->Form->end();
以及提交表单调试后得到的结果($ this-> request-> data):
[
'articles_categories' => [
(int) 0 => '1'
],
'title' => 'test article',
'body' => 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.'
]
Run Code Online (Sandbox Code Playgroud)
我的问题是我不确定我的关联是否正确.如何自动在连接表中插入数据?
这不是belongsToMany关联的正确格式,请参阅
默认情况下,属性名称应为关联的下划线复数名称,因此在本例中categories.
_ids钥匙由于您要将文章链接到已存在的类别,您还应该使用魔术_ids键传递所选类别的ID,然后编组将负责其余的操作,即Category根据给定的内容选择并插入相应的实体ID,请参阅
http://book.cakephp.org/3.0/en/orm/saving-data.html#converting-belongstomany-data
您需要做的就是将它附加到字段/属性名称,例如categories._ids,您的表单输入应该像这样定义:
$this->Form->input('categories._ids', [
'options' => $categories,
'id' => 'magicselect',
'multiple' => true,
'class' => 'form-control'
]);
Run Code Online (Sandbox Code Playgroud)
请注意,没有必要显式传递选项,如果您遵循约定,即使用下划线复数的关联名称,那么表单助手将能够自动获取变量,就像它对其他输入字段一样.