属于 cakephp 关系不起作用
Posted
技术标签:
【中文标题】属于 cakephp 关系不起作用【英文标题】:belongsTo cakephp relation not working 【发布时间】:2014-07-31 20:33:02 【问题描述】:我是 cakephp 新手,我遵循了一些关于它的教程。现在我正在尝试构建我的第一个应用程序,并且我被这种关系“belongsTo”所困扰。这不正常,更有可能我做错了什么。这是我的表格、模型和控制器。
这是不显示任何员工 ID 或姓名的视图。它让我发疯!!!。 位于 app/View/Pendings/add.ctp 下:
<div class='form'>
<?php echo $this->Form->create('Pending'); ?>
<fieldset>
<legend>Nueva Tarea</legend>
<?php
echo $this->Form->input('subject', array('label' => 'Asunto'));
echo $this->Form->input('body', array('label' => 'Descripcion', 'rows' => '3'));
echo $this->Form->input('staff_id', array('label' => 'Asignar a miembro'));
?>
</fieldset>
<?php echo $this->Form->end('Asignar'); ?>
</div>
其中 staff_id 是此模型待定的外键。并且对应于staffs表中的id。所以我尝试做的是 Staff hasMany Pending,而 Pending 属于 Staff。因为待处理是员工的一种待处理任务。这就是为什么员工有很多待处理的原因。
这是 Pending 模型,在 app/Model/Pending.php 中,具有 'belongsTo' 关系:
<?php
class Pending extends AppModel
public $validate = array(
'subject' => array(
'rule' => 'notEmpty',
'message' => 'Debe ingresar un Asunto.'
),
'body' => array(
'rule' => 'notEmpty',
'message' => 'Debe ingresar una Descripción.'
)
);
public $belongsTo = array(
'Staff' => array(
'className' => 'Staff',
'foreignKey' => 'staff_id'
)
);
?>
这是员工模型,在 app/Model/Staff.php 中,具有“hasMany”关系:
<?php
class Staff extends AppModel
public $displayField = 'name';
public $validate = array(
'last_name' => array(
'rule' => 'notEmpty'
),
'name' => array(
'rule' => 'notEmpty'
),
'passwd' => array(
'rule' => 'notEmpty'
),
'email' => array(
'rule' => 'notEmpty'
)
);
public $hasMany = array(
'Pending' => array(
'className' => 'Pending',
'foreignKey' => 'staff_id'
)
);
?>
最后是我的两张表,staff 和 pending
mysql> describe staffs;
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| name | varchar(40) | NO | | NULL | |
| last_name | varchar(40) | NO | | NULL | |
| email | varchar(40) | NO | | NULL | |
| password | varchar(20) | YES | | NULL | |
| active | tinyint(1) | YES | | 1 | |
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| created | datetime | YES | | NULL | |
| modified | datetime | YES | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
mysql> describe pendings;
+----------+------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| staff_id | int(10) unsigned | YES | MUL | NULL | |
| created | datetime | NO | | NULL | |
| pdate | datetime | YES | | NULL | |
| subject | varchar(250) | YES | | NULL | |
| body | tinytext | YES | | NULL | |
| state | enum('pending','done','reasigned') | YES | | pending | |
+----------+------------------------------------+------+-----+---------+----------------+
我想我遵循了 cakephp 约定。我真的看不出我的错误。非常感谢您的帮助。
抱歉,这里是控制器(app/Controller/PendingsController.php):
<?php
class PendingsController extends AppController
public function index()
$this->Pending->recursive = 0;
$this->set('pendings', $this->paginate());
public function add()
if( $this->request->is('post') )
if( $this->Pending->save($this->request->data) )
$this->Session->setFlash('Tarea Asignada');
$this->redirect(array('action' => 'index'));
$staffs = $this->Pending->Staff->find('list');
?>
【问题讨论】:
您希望视图显示可用于链接新待处理的员工列表(或类似列表)?我对你的理解正确吗?如果是这样...那么,您需要在控制器中显示相应的操作,因为我没有看到您将该列表传递给任何地方的视图。 是的,是的,当我使用 add 进行新的挂起时,我想通过显示一个带有其名称的选择来为其分配一个员工。我以为你不必将列表传递给动作,因为蛋糕通过模型关系知道这个列表。但我要检查一下。谢谢农瑟!! 【参考方案1】:Cake 的魔法起作用了……有一个条件……
您的想法是正确的,因为模型关系设置正确,它应该只是......工作。但是您缺少一个部分:将列表传递给视图。那部分并不神奇。
阅读this part of the docs(几乎在inputs
开始之前一直读下去)
如果您想在使用 belongsTo - 或 hasOne - 关系时创建选择字段,您可以添加以下 [...]
(现在放你应该放的东西……)
$this->set('staffs', $this->Pending->Staff->find('list'));
备注:注意变量名,是模型的复数形式。然后你把一个列表放到那个变量中。
在视图中,你做你正在做的事情
echo $this->Form->input('staff_id', array('label' => 'Asignar a miembro'));
你应该完成了:)
[编辑] 刚刚看到你的最后一次编辑。你不见了
$this->set('staffs', $staffs);
//or
$this->set(compact('staffs'));
【讨论】:
以上是关于属于 cakephp 关系不起作用的主要内容,如果未能解决你的问题,请参考以下文章