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モデルです(関連付け付き):

Lead.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'
        )
    );  

}

Profile.php

class Profile extends AppModel {

    public $name = 'Profile';

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

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

}

Address.php

class Address extends AppModel {

    public $name = 'Address';

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

}

Service.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'
    )
)

問題:

1つのことを除いて、すべて正常に機能します...saveAll()すべてのデータを(各モデルで)正しく保存しますが、アドレステーブルでは、CakePhpがprofile_idを挿入し、このフィールドのみが表示されますが、FORMから生成された配列でわかるように、電話もあります!

Cakephp が電話フィールドも挿入しないのはなぜですか?

ありがとうございました

4

2 に答える 2

2

コードを作成しているため、機能しません。

Cake のドキュメントのどこにも、次のコードを使用するように指示されていません。

正しくない

$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 に答える