我正在尝试建立一个非常简单的网站来创建和编辑食谱(法语中的'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' => ''
)
);
}
所以在连接模型中没有保存任何东西,我有这个警告......
任何帮助表示感谢,当然如果有任何不清楚的地方请告诉我! 非常感谢!!
答案 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*/ ),
)
);