脚本宝典收集整理的这篇文章主要介绍了saveAll()使用CakePHP 2.3.1失败,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下型号:
>艺术家有很多艺术家预览
> ArtistPreview属于艺术家
使用save()函数保存Artist模型没有问题,但是当我尝试使用saveAll方法时,Cake似乎验证失败 – 这很疯狂,因为我甚至完全从模型中删除了所有验证规则.
这是我的观点,没什么了不起的:
<?PHP echo $this->Form->create('Artist',array('inputDefaults' => array('class' => 'input-block-level'))); echo $this->Form->input('Artist.name',array('label' => __('Name'))); echo $this->Form->input('Artist.artist_section_id',array('label' => __('Section'),'empty' => true)); ?> <label>Tags</label> <div class="checkBoxes"> <?PHP echo $this->Form->input('Tag',array('label' => false,'multiple' => 'checkBox','class' => false));; ?> </div> <?PHP echo $this->Form->input('Artist.website',array('label' => __('Website'))); echo $this->Form->input('ArtistPreview.0.url',array('label' => __('Artist Preview'))); echo $this->Form->input('Artist.description',array('label' => __('Description'))); ?> <?PHP echo $this->Form->submit(__('Add'),array('class' => 'btn btn-primary btn-large','div' => false)) . ' '; echo $this->Form->button(__('Cancel'),array('type' => 'button','class' => 'btn btn-large','div' => false,'onclick' => 'closeDialog()')); echo $this->Form->end(); ?>
public function add() { $this->layout = 'form'; if (!$this->request->is('ajax')) { throw new ForbiddenException(); } if ($this->request->is('post')) { $this->setData($this->request->data['Artist'],array( 'user_id' => AuthComponent::user('id'),'date' => $this->Date->gmt() )); if ($this->Artist->saveAll($this->request->data)) { $this->redirectAjax('/artists/view/' . $this->Artist->id); } } $this->set(array( 'title_for_layout' => 'Add Artist','artistSections' => $this->Artist->ArtistSection->find('list',array('order' => 'name')),'tags' => $this->Artist->Tag->find('list',array('order' => 'name')) )); }
如上所述,saveAll方法每次都失败.我已经检查了输出是什么,而Cake正在输出一堆带有错误消息类的空白< div>,但是没有消息.表单上的每个字段都会获得其中一个div.
现在,当我更改我的代码以使用save函数而不是saveAll时,除了ArtistPreview数据之外,所有内容都会被正确保存,这是预期的.甚至我的HABTM标签也正确保存,并且没有任何验证失败.
我从1.3天开始就一直在使用Cake,所以我对它非常熟悉,甚至完成了我之前项目中的要求.我倾向于这是一个错误,除非我在这里遗漏了一些东西.有任何想法吗?
编辑
我还尝试了saveAssociated方法,并在尝试保存时将深度键设置为true.这将让我保存艺术家,但不会保存相关数据(ArtistPreview).
编辑2
根据要求,这是两个表:
-- ----------------------------------------------------- -- Table `artists` -- ----------------------------------------------------- DROP TABLE IF EXISTS `artists` ; CREATE TABLE IF NOT EXISTS `artists` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`user_id` INT UNSIGNED NULL,`artist_section_id` INT UNSIGNED NULL,`artist_status_id` INT UNSIGNED NULL,`name` VARCHAR(200) NULL,`website` VARCHAR(500) NULL,`description` TEXT NULL,`date` DATETIME NULL,`comment_count` INT UNSIGNED NOT NULL DEFAULT 0,PRIMARY KEY (`id`),INDEX `FK_artists_users_idx` (`user_id` ASC),INDEX `FK_artists__artist_sections_idx` (`artist_section_id` ASC),INDEX `FK_artists__artist_statuses_idx` (`artist_status_id` ASC),CONSTRAINT `FK_artists__users` FOREIGN KEY (`user_id` ) REFERENCES `users` (`id` ) ON DELETE SET NULL ON UPDATE CASCADE,CONSTRAINT `FK_artists__artist_sections` FOREIGN KEY (`artist_section_id` ) REFERENCES `artist_sections` (`id` ) ON DELETE SET NULL ON UPDATE CASCADE,CONSTRAINT `FK_artists__artist_statuses` FOREIGN KEY (`artist_status_id` ) REFERENCES `artist_statuses` (`id` ) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `artist_previews` -- ----------------------------------------------------- DROP TABLE IF EXISTS `artist_previews` ; CREATE TABLE IF NOT EXISTS `artist_previews` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`artist_id` INT UNSIGNED NULL,`url` VARCHAR(500) NULL,INDEX `FK_artist_previews__artists_idx` (`artist_id` ASC),CONSTRAINT `FK_artist_previews__artists` FOREIGN KEY (`artist_id` ) REFERENCES `artists` (`id` ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB;
这是我的setData函数,它只合并了两个数组.我没有使用隐藏字段,而是在控制器中设置了未被用户输入填充的字段:
public function setData(&$original,$new) { $original = array_merge($original,$new); }
class Artist extends AppModel { public $belongsTo = array( 'User','ArtistSection','ArtistStatus' ); public $hasMany = array( 'ArtistPicture','Artist' // <--- problem was here,had 'Artist' instead of 'ArtistPreview' ); public $hasAndBelongsToMany = array( 'Tag' ); public function __construct($id = false,$table = null,$ds = null) { parent::__construct($id,$table,$ds); $this->validate = array( 'name' => array( 'rule' => 'notEmpty','message' => __('Artist name cannot be blank.') ),'website' => array( 'rule' => 'url','message' => __('Must be a valid URL.'),'allowEmpty' => true ),'artist_section_id' => array( 'rule' => 'notEmpty','message' => __('Section is required.') ) ); } }
感谢那些花时间看这个问题的人,即使我发布了错误的信息.
以上是脚本宝典为你收集整理的saveAll()使用CakePHP 2.3.1失败全部内容,希望文章能够帮你解决saveAll()使用CakePHP 2.3.1失败所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。