我正在构建一个CakePHP 2.3应用程序,无法终生了解为什么saveAll始终失败。

我有以下型号:

  • Artist has很多ArtistPreview
  • ArtistPreview属于Artist

  • 我使用Artist函数保存save()模型没有问题,但是,一旦我尝试使用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();
    ?>
    

    这是我的add Controller 方法:
    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>类输出了一堆空白的error-message,但是没有消息。表单上的每个字段都会获得这些div之一。

    现在,当我更改代码以使用save函数而不是saveAll时,除了ArtistPreview数据(可以预期的)之外,所有内容都会正确保存。甚至我的HABTM标签都已正确保存,并且没有任何事情无法通过验证。

    从1.3天开始我就一直在使用Cake,所以我对此非常熟悉,甚至完全按照我在以前的项目中的要求进行了工作。我倾向于这是一个错误,除非我在这里丢失了一些东西。有任何想法吗?

    编辑

    我还尝试了saveAssociated方法,并在尝试保存时将deep键设置为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函数,它仅合并两个数组。我没有使用隐藏字段,而是在 Controller 中设置了用户输入未填充的字段:
    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.')
                )
            );
        }
    }
    

    谢谢那些花时间研究这个问题的人,尽管我发布了错误的信息。

    08-19 00:21