无需表单即可保存 cakePHP HABTM 数据

Posted

技术标签:

【中文标题】无需表单即可保存 cakePHP HABTM 数据【英文标题】:saving cakePHP HABTM data without a form 【发布时间】:2011-03-19 13:20:00 【问题描述】:

我想构建我自己的数据数组以保存在 HABTM 关系中。

型号:

var $hasAndBelongsToMany = array(
    'TweetSearch' => array(
        'className' => 'TweetSearch',
        'joinTable' => 'favorites_tweet_searches',
        'foreignKey' => 'favorite_id',
        'associationForeignKey' => 'tweet_search_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )
);

var $hasAndBelongsToMany = array(
    'Favorite' => array(
        'className' => 'Favorite',
        'joinTable' => 'favorites_tweet_searches',
        'foreignKey' => 'tweet_search_id',
        'associationForeignKey' => 'favorite_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )
);

然后在收藏夹控制器中:

function add($searchText='lala') 

    $tweetSearch = trim($searchText);
    //Save tweet search
    $tweet = $this->Favorite->TweetSearch->find('first',array(
        'conditions'=>array('TweetSearch.search' => $tweetSearch),
        'recursive' => -1));

    if(empty($tweet))
    
            if(!$this->Favorite->TweetSearch->save(array('TweetSearch.search' => $tweetSearch)))
            
                echo 'Search cannot be saved. Please try again.';
                return ;
            
            //debug('ok');
            $tweetID = $this->Favorite->TweetSearch->id;
            $toSave = array('TweetSearch' => array('id' => $tweetID));
    
    else
    
        $tweetID = $tweet['TweetSearch']['id'];
        $toSave = $tweet;
    

    $links = array();
    $this->params['form']['favlinks'] = array('http://www.lala.gr','http://www.anarxeio.gr');
    $i=0;   
    foreach($this->params['form']['favlinks'] as $link)
    
        $links['user_id'] = $this->_userDetails['id'];
        $links['link'] = trim($link);
        $links['id'] = $i++;

        //$links['FavoritesTweetSearch']=array('tweet_search_id' => $tweetID);

        $toSave['Favorite'][] = $links;
    

    if(!$this->Favorite->saveAll($toSave))
    
            echo 'Search cannot be saved. Please try again.';
            //return ;
        

    debug($toSave);

    //exit();

如您所见,我在这里手动创建数据只是为了测试它。我没有提交的表格。 但是数据没有保存,sql dump 显示:

9   START TRANSACTION       0       0
10  SELECT `FavoritesTweetSearch`.`tweet_search_id` FROM `favorites_tweet_searches` AS `FavoritesTweetSearch` WHERE `FavoritesTweetSearch`.`favorite_id` = ''       1   1   0
11  DELETE `FavoritesTweetSearch` FROM `favorites_tweet_searches` AS `FavoritesTweetSearch` WHERE `FavoritesTweetSearch`.`favorite_id` = '' AND `FavoritesTweetSearch`.`tweet_search_id` = (0)      1       0
12  INSERT INTO `favorites_tweet_searches` (`favorite_id`,`tweet_search_id`) VALUES ('','1'), ('','0')      2       0
13  COMMIT

【问题讨论】:

发布您拥有的数据库架构和数据。第一个 SELECT 语句正在搜索空白值! (favorite_id = '') 你能把 debug($toSave) 的输出贴出来吗? 【参考方案1】:

删除此行。

$links['id'] = $i++;

Id 字段是自动递增的,因此无需为其分配值。 然后改变这部分:

if(!$this->Favorite->saveAll($toSave['Favorite']))

    echo 'Search cannot be saved. Please try again.';
    //return ;

【讨论】:

以上是关于无需表单即可保存 cakePHP HABTM 数据的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 在 HABTM 表中保存数据

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

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

CakePHP 在 HABTM 字段中保存数据

是否可以使用 Cakephp 中的 saveAll 一次将所有相关记录插入到 HABTM 中?

在 HABTM 的情况下,CakePHP 不会保存正确的数据