在 CakePHP 中使用 HABTM 保存 hasOne

Posted

技术标签:

【中文标题】在 CakePHP 中使用 HABTM 保存 hasOne【英文标题】:Saving hasOne with HABTM in CakePHP 【发布时间】:2010-12-01 04:38:20 【问题描述】:

当我将 hasOne 关系添加到其中一个 habtm 模型时,就会出现此问题。 categories_posts 现在不要在数据库中保存任何内容。我以前做过。

现在,我的表格是这样的:

<?php
echo $this->Form->create('Post');
echo $this->Form->input('Post.title');
echo $this->Form->input('Post.Category', array('multiple' => 'checkbox'));
echo $this->Form->input('Post.body', array('rows' => '3'));

echo $this->Form->input('Page.title');
echo $this->Form->input('Page.uri');
echo $this->Form->input('Page.meta_keywords');
echo $this->Form->input('Page.meta_description');
echo $this->Form->input('Page.layout');

echo $this->Form->end('Save Post');
?>

页面模型如下所示:

class Page extends AppModel 
 var $name = 'Page';
 var $order = array('Page.modified' => 'desc');

 var $hasOne = array(
  'Post' => array(
   'className' => 'Post'
  ));

 var $hasMany = array(
  'Snippet' => array(
   'className' => 'Snippet'
  ));

后模型如下所示:

class Post extends AppModel 
 var $name = 'Post';
 var $hasAndBelongsToMany = array(
  'Category' => array(
   'className' => 'Category'
  )
 );
 var $belongsTo = array(
  'Page' => array(
   'className' => 'Page'
  )
 );
 var $actsAs = array('Containable');
 var $virtualFields = array(
  'date_posted' => 'DATE_SUB(Post.created, INTERVAL 7 DAY)'
 );


类别模型如下所示:

class Category extends AppModel 
    var $name = 'Category';
    var $hasAndBelongsToMany = array(
        'Post' => array(
            'className' => 'Post'
        )
    );

    var $actsAs = array('Containable');

我的表格有点像这样:

categories
id name

categories_posts
category_id post_id

pages
id title uri meta_keywords meta_description layout created modified

posts
id page_id title uri body created modified

这是保存的方法

function admin_add() 
    $this->set('categories', $this->Post->Category->find('list'));

    if ( ! empty($this->data)) 
        if ($this->Post->saveAll($this->data)) 
            $this->Session->setFlash('Your post has been saved', 'flash_good');
            $this->redirect($this->here);
         else 
            $this->Session->setFlash('Your post has not been saved','flash_bad'); 
        
    

这是提交时的示例数组:

array(2) 
  ["Post"]=>
  array(3) 
    ["title"]=>
    string(10) "Post Title"
    ["Category"]=>
    array(4) 
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
      [3]=>
      string(1) "4"
    
    ["body"]=>
    string(16) "<p>Post Body</p>"
  
  ["Page"]=>
  array(5) 
    ["title"]=>
    string(10) "Page Title"
    ["uri"]=>
    string(0) ""
    ["meta_keywords"]=>
    string(11) "Page Meta K"
    ["meta_description"]=>
    string(11) "Page Meta D"
    ["layout"]=>
    string(11) "Page Layout"
  

为什么categories_posts 不保存?

【问题讨论】:

【参考方案1】:

看来我需要做的就是把它写成这样:

echo $this->Form->input('Category.Category', array('multiple' => 'checkbox'));

【讨论】:

以上是关于在 CakePHP 中使用 HABTM 保存 hasOne的主要内容,如果未能解决你的问题,请参考以下文章

cakephp 在不使用视图的情况下保存 HABTM 关系的数据

CakePHP 使用 saveAll:如何使用 HABTM 链接记录保存额外数据?

CakePHP HABTM 关系保存新的关联

CakePHP 2.5 habtm 不保存

CakePHP 在 HABTM 表中保存数据

尝试在保存时保存 CakePHP HABTM 关系中的重复关联