3

我在使用CakePHP 2.2.4时遇到了一个非常奇怪的问题,让我解释一下发生了什么。

我有这些mysql表:

线索

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id    | int(11)      | YES  | MUL | NULL    |                |
| date       | datetime     | YES  |     | NULL    |                |
| ip         | varchar(45)  | YES  |     | NULL    |                |
| service_id | int(11)      | YES  | MUL | NULL    |                |
| location   | varchar(255) | YES  |     | NULL    |                |
| message    | text         | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

用户

+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| email   | varchar(200) | YES  |     | NULL    |                |
| pwd     | varchar(200) | YES  |     | NULL    |                |
| role_id | int(11)      | YES  | MUL | NULL    |                |
| active  | tinyint(4)   | YES  |     | 0       |                |
+---------+--------------+------+-----+---------+----------------+

简介

+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id | int(11)      | YES  | MUL | NULL    |                |
| name    | varchar(120) | YES  |     | NULL    |                |
| surname | varchar(120) | YES  |     | NULL    |                |
| company | varchar(200) | YES  |     | NULL    |                |
| vat     | varchar(60)  | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

地址

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| profile_id | int(11)      | YES  | MUL | NULL    |                |
| address    | varchar(255) | YES  |     | NULL    |                |
| city       | varchar(120) | YES  |     | NULL    |                |
| zip_code   | char(5)      | YES  |     | NULL    |                |
| nation     | varchar(120) | YES  |     | NULL    |                |
| telephone  | varchar(200) | YES  |     | NULL    |                |
| mobile     | varchar(200) | YES  |     | NULL    |                |
| fax        | varchar(200) | YES  |     | NULL    |                |
| email      | varchar(200) | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

角色

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

服务

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

以下是我使用的所有 CakePhp 模型(带有关联):

铅.php

class Lead extends AppModel {

    public $name = 'Lead';

    /* Relazioni */      
    public $belongsTo = array('User', 'Service');
}

用户.php

class User extends AppModel {

    public $name = 'User';

    /* Relazioni */
    public $hasOne = 'Profile';

    public $belongsTo = 'Role';

    public $hasMany = array(
        'Lead' => array(
            'className' => 'Lead'
        )
    );  

}

配置文件.php

class Profile extends AppModel {

    public $name = 'Profile';

    /* Relazioni */
    public $belongsTo = 'User';

    public $hasMany = array(
        'Address' => array(
            'className' => 'Address'
        )
    );  

}

地址.php

class Address extends AppModel {

    public $name = 'Address';

    /* Relazioni */        
    public $belongsTo = 'Profile';

}

服务.php

class Service extends AppModel {

    public $name = 'Service';

}

我有一个必须保存在多个 mysql 表中的表格。

这是我用来起草表格的代码:

<?php

echo $this->Form->create(null, array(
                            'inputDefaults' => array(
                                'error' => false
                            )
                        )
                ); //create(false) per il form senza il modello

echo $this->Form->input('User.Profile.name', array(
                            'label' => array(   
                                'class' => 'name-form',                                                                                                                                         
                                'text'  => 'Nome:'                                                                      
                            ),                                                              
                            'style' => 'width:238px;',
                            'div'   => 'field'
                        )
               );                               

echo $this->Form->input('User.Profile.surname', array(
                            'label' => array(   
                                'class' => 'name-form',                                                                                                                                         
                                'text'  => 'Cognome:'                                                                       
                            ),                                                              
                            'style' => 'width:238px;',
                            'div'   => 'field'
                        )
               );                                   

?>

<div class="clear"></div>

<?php

echo $this->Form->input('User.email', array(
                            'label' => array(                                                                       
                                'class' => 'name-form',
                                'text'  => 'Email:'
                            ),                                                              
                            'div'   => 'field', 
                            'class' => 'input-xlarge'
                        )
               );

echo $this->Form->input('User.Profile.Address.telephone', array(
                            'label' => array(   
                                'class' => 'name-form',                                                                                                                                         
                                'text'  => 'Telefono:'                                                                      
                            ),                                                          
                            'div'   => 'field'
                        )
               );                          
?>

<div class="clear"></div>


<?php                      

echo $this->Form->input('Lead.service_id',
                    array(
                        'label' => array(                                                                       
                            'class' => 'name-form',
                            'text'  => 'Servizio richiesto:'
                        ),                                                              
                        'div'   => 'field',
                        'type'  => 'select',                                                                
                        'options' => $services                                      
                    )
);                              

echo $this->Form->input('Lead.location', array(
                            'label' => array(                                                                       
                                'class' => 'name-form',
                                'text'  => 'Vicino a:'
                            ),                                                              
                            'div'   => 'field', 
                            'class' => 'input-xlarge'
                        )
               );                               

?>

<div class="clear"></div>


<?php

echo $this->Form->input('Lead.message', array(
                            'label' => array(                                                                       
                                'class' => 'message-form',
                                'text'  => 'Richiesta:'
                            ),                                                              
                            'div'   => 'field', 
                            'class' => 'form-field',
                            'type'  => 'textarea'
                        )
               );                                                               

echo $this->Form->button('Invia Richiesta', array(
                                        'type'  => 'submit',
                                        'class' => 'submit-btn less-margin'
                                    )
                );

echo $this->Form->end();

?>

这是保存数据的控制器(PagesController)的操作:

public function home() 
{       
   if ($this->request->is('post'))
   {
    $this->loadModel('Lead');

    $this->request->data['Lead']['ip']   = $_SERVER['REMOTE_ADDR'];
    $this->request->data['Lead']['date'] = date('Y-m-d H:i:s'); 
    $this->request->data['User']['role_id'] = 3;    

    $this->Lead->set($this->request->data);

    debug($this->request->data);

    if ($this->Lead->validates()) 
    {
        // Dati nel modulo corretti
        debug($this->Lead->saveAll($this->request->data, array('deep' => true)));
    } 
    else 
    {
        // Errore nella validazione
        $this->Session->setFlash('Completare correttamente il form', 'default', array('class' => 'errore'), 'lead');

        $errors = $this->Lead->validationErrors;                
        debug($errors);
    }   
}

$this->loadModel('Service');

$this->set('services', $this->Service->find('list'));               

}

这是从 FORM 生成的输出:

array(
    'User' => array(
        'Profile' => array(
            'name' => 'The Name',
            'surname' => 'The Surname',
            'Address' => array(
                'telephone' => 'The Telephone'
            )
        ),
        'email' => 'the@email.com',
        'role_id' => (int) 3
    ),
    'Lead' => array(
        'service_id' => '1',
        'location' => 'The location',
        'message' => 'This is the request',
        'ip' => '127.0.0.1',
        'date' => '2013-01-01 08:07:42'
    )
)

问题:

一切正常,除了一件事......saveAll()正确保存所有数据(在每个模型中),但在地址表中我只看到 CakePhp 插入profile_id,只有这个字段,但正如您在从 FORM 生成的数组中看到的那样,我也有电话!

为什么 cakephp 不也插入电话字段?

谢谢

4

2 回答 2

2

您正在编写代码,因此它不起作用。

蛋糕文档中没有任何地方说使用以下代码:

不正确

$this->Form->input('User.Profile.surname');
$this->Form->input('User.Profile.Address.telephone');

你不能只是把单词串在一起,然后寄希望于最好的结果。您可以使用:

正确的

$this->Form->input('field');
$this->Form->input('Model.field');
$this->Form->input('Model.n.field');

没有其他有效的方法可以输入字段。

与其编造东西,不如阅读文档

$this->Form->input('Profile.surname');
于 2013-01-01T09:18:54.913 回答
0

saveAll函数只是 saveMany 和 saveAssociated 方法的包装。”

尝试使用saveAssociated,以便您强制使用该saveAssociated方法。还是通过了array('deep'=>true);。您的输出格式的方式,它可能会尝试自动使用saveMany.

此外,如果您对模型中的字段进行了验证telephone,它将失败,因为您有一个不包含任何数字的字符串。The Telephone. 或者,您可以传递'validate' => false.

于 2013-01-01T12:21:49.780 回答