通过保存和错误array_merge()来阻止HasMany

时间:2013-12-26 23:11:42

标签: cakephp cakephp-2.0

我正在尝试建立一个非常简单的网站来创建和编辑食谱(法语中的'Recettes')。

我是一位经验丰富的前端开发人员,拥有丰富的PHP知识(非高级),过去我一直在与开发团队合作开发CakePhp。我正在学习从头开始项目的基础,这真的不那么容易。 我已经设置了一个项目,数据库(Ingredients,Recette和IngredientRecette),并使用Bake生成大部分代码。

我的3个模型有一个可用的CRUD工作流程,剩下要做的唯一事情是能够从Recette / add页面添加成分但是我被卡住了。我按照蛋糕php网站(http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany-through-the-join-model)和其他网站上的说明(因为cakephp的文档上的帮助真的没那么有帮助)而且我相信我已经建立了正确的Hasmany Through关系。 但是saveAll函数没有在连接模型(IngredientRecette)中保存任何东西,并且在我成功解决了另一个花了我几个小时才能解决的问题后,我遇到了一个特定的错误(见下文)! 所以我觉得我已经检查过,并仔细检查过,并对我的代码中的所有内容进行了三重检查,并且我已经在论坛等上阅读了所有问题和答案......

而且我遇到了这个问题,也许有一些明显我没想到的东西,或者也许并且绝对不明白Cakephp是如何真正的wordk :( 无论如何,提前感谢那些能够为此提供建议或帮助的人:

以下是我提交/ recettes / add后得到的错误(我添加了一些表单元素以向我的Recette添加成分和数量):

  

警告(2):array_merge()[function.array-merge]:参数#2不是数组[CORE \ Cake \ Model \ Model.php,第2250行]

这是我传递给控制器​​中saveAll()方法的数组(从debug()输出):

    array(
    'Recette' => array(
    'auteur' => '7',
    'nom' => 'Nouvelle Recette',
    'cout' => 'Pas cher',
    'niveau' => '5',
    'tps_realisation' => '30 min',
        'nb_personnes' => '6',
        'description' => 'Description data',
        'remarque' => ''
    ),
    'AssociatedIngredient' => array(
        'id_ingredient' => '6',
        'quantite' => '70 cl',
        'id_recette' => '7654'
    )
)

这是我的控制器代码:

<?php
App::uses('AppController', 'Controller');
/**
 * Recettes Controller
 *
 * @property Recette $Recette
 */
class RecettesController extends AppController {


/**
 * index method
 *
 * @return void
 */
    public function index() {
        $this->Recette->recursive = 0;
        $this->set('recettes', $this->paginate());
    }

/**
 * view method
 *
 * @param string $id
 * @return void
 */
    public function view($id = null) {
        $this->Recette->id = $id;
        if (!$this->Recette->exists()) {
            throw new NotFoundException(__('Invalid recette'));
        }
        $this->set('recette', $this->Recette->read(null, $id));
    }

/**
 * add method
 *
 * @return void
 */
    public function add() {

        if ($this->request->is('post')) {
            debug($this->request->data);
            $this->Recette->create();
            if ($this->Recette->saveAll($this->request->data)) {
                $this->Session->setFlash(__('The recette has been saved'));
                //$this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The recette could not be saved. Please, try again.'));
            }
        }

        $this->loadModel('Ingredient');
        $liste_ingr = $this->Ingredient->find('all');

        $this->set('liste_ingr', $liste_ingr);
    }

IngredientRecette模型

<?php
App::uses('AppModel', 'Model');
/**
 * Recette Model
 *
 * @property IngredientRecette $ingredient
 */
class Recette extends AppModel {
/**
 * Use database config
 *
 * @var string
 */
    public $useDbConfig = 'default';
/**
 * Use table
 *
 * @var mixed False or table name
 */
    public $useTable = 'recette';
/**
 * Primary key field
 *
 * @var string
 */
    public $primaryKey = 'id_recette';
/**
 * Display field
 *
 * @var string
 */
    public $displayField = 'nom';
    public $recursive = 2;


/**
 * Validation rules
 *
 * @var array
 */
    public $validate = array(
        'id_recette' => array(
            'numeric' => array(
                'rule' => array('numeric'),
            ),
        ),
        'auteur' => array(
            'numeric' => array(
                'rule' => array('numeric'),
            ),
        ),
        'nom' => array(
            'notempty' => array(
                'rule' => array('notempty'),
            ),
        ),
        'niveau' => array(
            'numeric' => array(
                'rule' => array('numeric'),
            ),
        ),
        'nb_personnes' => array(
            'numeric' => array(
                'rule' => array('numeric'),
            ),
        ),

    );

    //The Associations below have been created with all possible keys, those that are not needed can be removed

/**
 * hasMany associations
 *
 * @var array
 */
    public $hasMany = array(
        'AssociatedIngredient' => array(
            'className' => 'IngredientRecette',
            'foreignKey' => 'id_recette',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );

}

和IngredientRecette模型(连接模型)

<?php
App::uses('AppModel', 'Model');
/**
 * IngredientRecette Model
 *
 * @property ingredient $ingredient
 * @property recette $recette
 */
class IngredientRecette extends AppModel {
/**
 * Use database config
 *
 * @var string
 */
    public $useDbConfig = 'default';
/**
 * Use table
 *
 * @var mixed False or table name
 */
    public $useTable = 'ingredient_recette';
/**
 * Primary key field
 *
 * @var string
 */
    public $primaryKey = 'id_ingredient_recette';
    public $recursive = 2;

    //The Associations below have been created with all possible keys, those that are not needed can be removed

/**
 * belongsTo associations
 *
 * @var array
 */
    public $belongsTo = array(
        'IngredientLiaison' => array(
            'className' => 'Ingredient',
            'foreignKey' => 'id_ingredient',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'RecetteLiaison' => array(
            'className' => 'Recette',
            'foreignKey' => 'id_recette',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );
}

所以在连接模型中没有保存任何东西,我有这个警告......

任何帮助表示感谢,当然如果有任何不清楚的地方请告诉我! 非常感谢!!

1 个答案:

答案 0 :(得分:0)

我认为您的数据格式不正确。如何尝试这个(注意我放在Associated Ingredient中的额外数组)。由于配方有许多相关成分,因此Associated Ingredient的数据应该是一系列数组。

 array(
'Recette' => array(
'auteur' => '7',
'nom' => 'Nouvelle Recette',
'cout' => 'Pas cher',
'niveau' => '5',
'tps_realisation' => '30 min',
    'nb_personnes' => '6',
    'description' => 'Description data',
    'remarque' => ''
),
'AssociatedIngredient' => array( 
     array( 
        'id_ingredient' => '6',
        'quantite' => '70 cl',
        'id_recette' => '7654'
     ),
     array( /*ingredient 2 data*/ ),
   )
);