模型关联不正确

时间:2014-02-20 19:49:17

标签: cakephp

我和CakePHP在一起几个月了。这是我第一次尝试CakePhp协会。我假设我几乎都遵循了所有的指示,但我的模型似乎还没有起作用。

这很简单'用户'和'简介'模型。表结构:用户:
- id(主键)
- 姓名

资料:
- id(主键)
- 角色
- user_id(参考密钥)

模特:用户:

class UserModel extends AppModel{
    var $name = 'User';
    public $hasOne = array(
        'Profile'
    );

}

个人资料:

class ProfileModel extends AppModel{
    var $name = 'Profile';
    public $belongsTo = array('User'); } 

控制器:用户:

lass UsersController extends AppController{
    var $name = 'Users';
    public $scaffold;

    function index(){
        $user = $this->User->find('all'); //HERE I expect to get User and Profiles data
        pr($user);
    }

} 

个人资料:

 class ProfilesController extends AppController{
    var $name = 'Profiles';
    public $scaffold;

    function index(){
        $profile = $this->Profile->find('all');
        pr($profile);
    }

} 

如果我运行用户:/ localhost / test_php_apps / users /我得到:

Array (
    [0] => Array
        (
            [User] => Array
                (
                    [id] => 1
                    [name] => rohini
                )

        )

) 

我想知道为什么'简介'数据未显示。我在表格中手动添加了记录。

此外,如果我尝试使用UsersController:$user = $this->User->Profile->find('all');,我会收到以下错误:

  

在非对象上调用成员函数find()

我的猜测是设置关联有问题。但不确定是什么搞乱了。

我知道这是一个非常基本的问题,但即使在阅读了10到15个相关案例后,我似乎也找不到答案。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

帮我一个忙,改变

class UserModel extends AppModel

class User extends AppModel

class ProfileModel extends AppModel

class Profile extends AppModel

并查看在UsersController中执行$user = $this->User->Profile->find('all');时是否有帮助。

另外,是

public $actsAs = array('Containable');

public $actAs = 'Containable';

不是actAs。看看是否有帮助。如果没有,了解你的蛋糕版本会很有帮助。

有关命名模型约定,请参阅here以了解可用内容和this

答案 1 :(得分:0)

在您的usermodel

中添加以下行
public $useTable = 'YOUR USERTABLENAME';

并更改

public $hasOne = array(
        'Profile'
    );

public $hasOne = 'Profile';

你的profilmodel中的

添加相同的内容。

public $useTable = 'YOUR PROFILETABLENAME';

并更改

public $belongsTo = array('User'); 

public $belongsTo = array('User' => array('className' => 'User',
                                          'foreignKey' => 'user_id'));
在您的userscontontroller中

添加此

public $uses = array('User','Profile');

通常在尝试查询时应该可以正常工作

$u = $this->User->find('all',array('contain' => array('Profile'));

$u = $this->User->find('all',array('recursive' => 2));

但如果你只写,它也应该有效:

$u $this->User->find('all');

问候

答案 2 :(得分:0)

如果你烘烤这件事会让你的生活更轻松。

模特:用户:

    class User extends AppModel{
        var $name = 'User';
        public $hasMany = array(
            'Profile'=>array(
                'className' => 'Profile',
                'foreignKey' => 'user_id',)
        );    
}

资料:

class Profile extends AppModel{
    var $name = 'Profile';
            public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id',
        )
    );

}

控制器:用户:

    class UsersController extends AppController{
        var $name = 'User';        

        public function index(){
            $users = $this->User->find('all'); 
            var_dump($users);
        }

} 

控制器配置文件:

    class ProfilesController extends AppController{
            var $name = 'Profile';        

            public function index(){
                $user_id = 2;
                $users = $this->Profile->find('all', array('conditions'=>array('Profile.user_id'=>$user_id))); 
                var_dump($users);
            }

    }