1

我想做一个简单的 cakephp 关联程序,但它不起作用。我有两个数据库表:userssec_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 模型的主键是id那么 cake 尝试将 Sec_data 中的外键与该键相关联,无论您设置什么条件。

首先你应该做类似的事情

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

但它只有在sec_idUser.id

如果您想要与 User.sec_id 相关的 Sec_data.sec_id(并且 User.sec_id 与 User.id 不同),那么您必须手动加入表

编辑:见评论

于 2013-10-31T12:58:55.517 回答
0

学习 cake php 中的模型关联。这是很好的解释http://www.phpsupercoder.com/model-association-cake-php

于 2013-11-07T09:32:33.120 回答
0

这里有几件事出了问题。您应该阅读 CakePHP 的约定。

  • 应该调用您关联的模型类SecData,然后它将自动映射到sec_datas表。
  • 无需使用loadModel.
  • 无需指定条件。recursive改为设置正确的级别。
  • 对于hasOne,只有一个表有外键。默认情况下,另一个模型有它(“用户 hasOne SecData”-> SecData 有外键)。因此,在您的示例中,您应该sec_id从中删除该列User,并将一user_id列添加到您的SecData模型中。

另见: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 回答