cakephp saveAll 不适用于关联

Posted

技术标签:

【中文标题】cakephp saveAll 不适用于关联【英文标题】:cakephp saveAll not working with associations 【发布时间】:2014-05-18 13:56:01 【问题描述】:

这个问题可能是重复的。但我对一些问题和教程感到困惑。

我尝试使用以下代码保存数组。

$data = array(
    'name' => 'ques 1',
    'description' => 'lskjdf sldkfj sdlfkjsd flskdjf sldkfjsd',
    'objective' => 'jd ldkjf sldkf sldfj sdlfjdlsfsjfl ds',
    'Question' => array(
        'type' => 'BOOLEAN',
        'body' => 'slkdjfs dflskdf slkfjsiuwsdjkf sd',
        'Answer' => array(
            'body' => 'sd fsldkjfs dddd ddd ddd'
        ),
    ),
);

$this->Questionnaire->create();
$this->Questionnaire->saveAll($data);

运行此代码问卷后,保存了 3 个问题,但没有任何答案。只有一个问题具有身体价值。

这是我的模型课。

问卷.php

<?php
App::uses('AppModel', 'Model');

/**
 * Questionnaire Model
 */
class Questionnaire extends AppModel 

    /**
     * Validation rules
     *
     * @var array
     */
    public $validate = array(
        'name' => array(
            'required' => array(
                'rule' => array('notEmpty'),
                'message' => 'Name is required'
            )
        ),
        'description' => array(

        ),
        'objective' => array(

        ),
    );

    public $hasMany = array(
        'Question' => array(
            'className' => 'Question',
            'foreignKey' => 'questionnairy_id'
        ),
    ); 


问题.php

<?php
App::uses('AppModel', 'Model');

/**
 * Question Model
 */
class Question extends AppModel 

    /**
     * Validation rules
     *
     * @var array
     */
    public $validate = array(
        'type' => array(
            'valid' => array(
                'rule' => array('inList', array(
                    BOOLEAN_ANSWER, 
                    SINGLE_ANSWER, 
                    MULTIPLE_ANSWER, 
                )),
                'message' => 'Invalide type',                
            )
        ),
        'body' => array(
            'required' => array(
                'rule' => array('notEmpty'),
                'message' => 'Question is required'
            )
        ),      
    );

    public $belongsTo = array(
        'Questionnaire' => array(
            'className' => 'Questionnaire',
            'foreignKey' => 'questionnaire_id'
        ),
    ); 

    public $hasMany = array(
        'Answer' => array(
            'className' => 'Answer',
            'foreignKey' => 'question_id'
        ),
    ); 


答案.php

<?php
App::uses('AppModel', 'Model');

/**
 * Answer Model
 */
class Answer extends AppModel 

    /**
     * Validation rules
     *
     * @var array
     */
    public $validate = array(
        'body' => array(
            'required' => array(
                'rule' => array('notEmpty'),
                'message' => 'Answer is required'
            )
        ),      
    );

    public $belongsTo = array(
        'Question' => array(
            'className' => 'Question',
            'foreignKey' => 'question_id'
        ),
    ); 


我需要知道保存这个数组的正确方法。请帮我。

【问题讨论】:

【参考方案1】:

您需要正确格式化数组。 $data 数组应如下所示:

array(
  'Questionnaire' => array(
    'name' => 'Questionnaire 1'
  ),
  'Question' => array(
    array(
      'type' => 'BOOLEAN',
      'body' => 'Is Cake sweet?',
      'Answer' => array(
        array(
          'body' => 'Yes.'
        )
      )
    ),
    array(
      'type' => 'BOOLEAN',
      'body' => 'Does Cake make things easy and fast?',
      'Answer' => array(
        array(
          'body' => 'Yes.'
        )
      )
    ),
  )
);

请注意,问题位于索引数组中(与答案相同)。这是因为他们的关系是 hasMany。

表单看起来像这样:

$this->Form->create('Questionnaire');
$this->Form->input('Questionnaire.name');
$this->Form->input('Question.0.type');
$this->Form->input('Question.0.body');
$this->Form->input('Question.0.Answer.0.body');
$this->Form->input('Question.1.type');
$this->Form->input('Question.1.body');
$this->Form->input('Question.1.Answer.0.body');
$this->Form->end();

最后,你需要告诉 Cake 在保存时继续:

$this->Questionnaire->saveAll($data, array('deep' => true));

查看本书了解更多信息:

http://book.cakephp.org/2.0/en/models/saving-your-data.html

【讨论】:

感谢您的代码。我只需要数据数组。作为您的阵列,我可以保存问卷和问题。但它不能保存答案。有什么问题? 使用插件模型时,在 Controller::loadModel() 调用或 Controller::$uses 变量中引用像这样的 PluginName.ModelClass 模型。

以上是关于cakephp saveAll 不适用于关联的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP如何在一个saveAll中不知道外键的情况下创建hasMany数据?

Cakephp 2.1 手动保存关联对象

在 CakePHP 中保存新的关联记录

CakePHP:用户数据 saveAll 静默失败?

Cakephp - saveAll 和 beforeSave

避免 CakePHP 的 saveAll 并使用手动查询