提问者:小点点

saveAll()在CakePHP 2.3中失败。1.


我正在构建一个CakePHP2.3应用程序,我一辈子都搞不懂为什么saveAll总是失败。

我有以下型号:

  • 艺术家有很多艺术家预览
  • 艺术家预览属性到艺术家

我没有问题保存我的艺术家模型与保存()函数,但是一旦我尝试使用保存所有方法,蛋糕似乎失败验证-这是疯狂的,因为我甚至完全删除我所有的模型验证规则。

我的观点是,没什么疯狂的:

<?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方法每次都失败。我已经检查了正在输出的内容,蛋糕正在输出一堆空白

现在,当我将代码更改为使用save功能而不是saveAll时,除了ArtistPreview数据之外,所有内容都得到了正确保存,这是意料之中的。甚至我的HABTM标签也被正确保存,没有任何东西不能通过验证。

我从1.3天就开始使用蛋糕了,所以我对它非常熟悉,甚至完全按照我在以前项目中的要求做了。我倾向于这是一个错误,除非我在这里遗漏了什么。有什么想法吗?

编辑

我还尝试了Save关联方法,以及在尝试保存时将深层键设置为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 ,
  `date` DATETIME NULL ,
  PRIMARY KEY (`id`) ,
  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);
}

共1个答案

匿名用户

所以我终于明白了这一点,哇,这是一个新手犯的错误。我想我昨天编码的时候一定是半睡半醒。问题出在我的模型中:

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.')
            )
        );
    }
}

感谢你们中的一些人,尽管我发布了错误的信息,但他们还是花时间来研究这个问题。