属于 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 关系不起作用的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 2.3.2 BasicAuthentication 不起作用

CakePHP 多选“选中”不起作用

Cakephp 在 IIS 中不起作用?

cakephp函数更新一行不起作用

UpdateAll 在 CakePHP 中不起作用

Cakephp 3:Json 渲染视图不起作用