无需表单即可保存 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 使用 saveAll:如何使用 HABTM 链接记录保存额外数据?