1

簡単な CakePHP 関連付けプログラムを実行したいのですが、うまくいきません。と の 2 つのデータベース テーブルがusersありsec_datasます。このプログラムを実行すると、同じ値usersを持つ両方のテーブルの結果ではなく、テーブルの最初の行の結果が表示されます。sec_id

コントローラーコード:

<?php
class UsersController extends AppController
{
    public function  index()
    {
        $this->autoRender = FALSE;
        $this->loadModel('User');
        $storeDivisions = $this->User->find();
        echo "<pre>";
        print_r($storeDivisions);
        echo "</pre>";
    }
}

モデルコード:

<?php
class User extends AppModel {
    public $useTable='users';

    public $hasOne = array(
        'Sec_data' => array(
            'ClassName' => 'Sec_data',
            'Conditions' => array('User.sec_id=Sec_data.sec_id'),
            'Dependent' => false
        )
    );  
}
?>
4

3 に答える 3

1

User モデルの主キーがidCake の場合、設定した条件に関係なく、Sec_data の外部キーをそのキーに関連付けてみます。

まず第一に、次のようにする必要があります

public $hasOne = array(
    'Sec_data' => array(
        'ClassName' => 'Sec_data',
        'ForeignKey' => 'sec_id',
        'Dependent' => false
    )
);

しかし、それsec_idはに関連している場合にのみ機能しますUser.id

User.sec_id に関連付けられた Sec_data.sec_id が必要な場合 (および User.sec_id が User.id とは異なる場合)、テーブルを手動で結合する必要があります。

編集:コメントを参照

于 2013-10-31T12:58:55.517 に答える
0

ここでうまくいかないことがいくつかあります。CakePHP の規約をよく読んでください。

  • 関連付けられたモデル クラスを呼び出す必要があります。SecDataその後、自動的にsec_datasテーブルにマップされます。
  • 使用する必要はありませんloadModel
  • 条件を指定する必要はありません。recursive代わりに正しいレベルを設定してください。
  • の場合hasOne、外部キーを持つテーブルは 1 つだけです。デフォルトでは、他のモデルがそれを持っています ("User hasOne SecData" -> SecData には外部キーがあります)。したがって、あなたの例では、sec_idから列を削除し、モデルに列をUser追加する必要があります。user_idSecData

関連項目: CakePHP アソシエーションに関する本

更新されたコントローラー コード:

<?php
class UsersController extends AppController {
    public $uses = array('User'); // Do this instead of loadModel

    public function  index() {
        $this->autoRender = FALSE;

        $this->User->recursive = 1; // Make User load associated records
        $storeDivisions = $this->User->find('all');
        pr($storeDivisions); // pr() is a Cake shorthand for print_r wrapped in <pre>
    }
}

モデルの場合:

<?php
class User extends AppModel {
    // Unecessary. Convention is to use lowercase classname + 's', which
    // already gives us 'users'
    // public $useTable='users'; 

    public $hasOne = array(
        'SecData' => array( // Model class Sec_Data must be renamed accordingly
            'dependent' => false
        )
    );  
}
?>
于 2013-10-31T14:43:58.510 に答える