我是CakePHP的新手,我在一个可以学习的例子中遇到问题。
我正在构建一个包含3个模型的插件(Categoria,Plato,Imagen)
它们之间的关系如下: 分类 - 柏拉图(n-n) 柏拉图 - Imagen(1-n)
如果我去Plato视图,我会通过这种关系获得所有Imagen,但是当我通过某个类别访问时,我无法访问与每个Plato关联的Imagen。为什么?问题是什么?
模型代码:
柏拉图:
App::uses('AppModel', 'Model');
class Plato extends ErestaurantAppModel {
public $name = 'Plato';
//public $actsAs = array('Containable');
public $hasAndBelongsToMany = array(
'Categoria' => array(
'className' => 'Categoria',
'joinTable' => 'categorias_platos',
'foreignKey' => 'plato_id',
'associationForeignKey' => 'categoria_id',
'unique' => 'keepExisting',
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
)
);
public $hasMany = array('Imagen' =>
array('foreingkey' => array('plato_id')));
}
分类:
App::uses('AppModel', 'Model');
class Categoria extends ErestaurantAppModel {
public $name = 'Categoria';
//public $actsAs = array('Containable');
public $hasAndBelongsToMany = array(
'Plato' => array(
'className' => 'Plato',
'joinTable' => 'categorias_platos',
'foreignKey' => 'categoria_id',
'associationForeignKey' => 'plato_id',
'unique' => 'keepExisting',
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
)
);
}
IMAGEN:
App::uses('AppModel', 'Model');
class Imagen extends ErestaurantAppModel {
public $name = 'Imagen';
//public $actsAs = array('Containable');
public $belongsTo = array('Plato');
}
最后,当我进入一个分类视图时,代码我将启动。
App::uses('AppController', 'Controller');
class CategoriasController extends ErestaurantAppController {
public $uses = array('Erestaurant.Categoria');
public function index() {
$this->Categoria->recursive = 0;
$this->set('data', $this->Categoria->find('all'));
}
public function view($id = null) {
if (!$this->Categoria->exists($id)) {
throw new NotFoundException(__('Registro inválido.'));
}
/*
$this->Categoria->recursive = -1;
$options = array('conditions' =>
array('Categoria.'.$this->Categoria->primaryKey => $id),
'contain' => array(
'Plato' => array(
'Imagen'
)
)
);
*/
$this->Categoria->recursive = 2;
$options = array('conditions' =>
array('Categoria.'.$this->Categoria->primaryKey => $id));
$this->set('item', $this->Categoria->find('first', $options));
}
}
您看到的评论代码是我尝试的另一种方式,使用Containable,但最后我得到错误" Plato与模型Imagen"
无关数据库似乎一切正常,每个表都根据需要创建(分类,平台,图像,Categias_platos),并创建所有foering键并尝试保留CakePHP默认名称。
谢谢!
答案 0 :(得分:0)
要访问深层关系,您必须使用可包含的行为。您在模型中有可包含行为的定义,但由于某种原因,它已被评论。
public $actsAs = array('Containable');
Uppon在您的类别中取消注释此行,您可以通过以下方式访问深层关系:
$this->Categoria->find('all', array(
'contain'=>array(
'Plato.Imagen'
)
));
......或类似的东西。有关详细信息,请访问此链接Containable Behavior