如何在CakePHP中加载关联模型并保存相关数据?

时间:2011-12-07 05:24:02

标签: cakephp model save

我正在设置一个用户/组系统,允许用户发送加入组的请求。

我似乎无法加载关联的模型并添加一行。真的很难抵制使用$ this-> query()并完成它的冲动......但我正在尝试学习Cake约定并以正确的方式做事。

在我的组模型处理组加入请求的函数中:

$this->loadModel('GroupRequest');
$this->data = array('GroupRequest' => 
array('user_id' => $uid, 'group_id' => $gid));

if($this->GroupRequest->save($this->data)){ echo 'save success'; } 
else { echo 'save fail'; }

以下是我运行时遇到的错误:

  

警告(512):SQL错误:1064:您的SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在第1行的'loadModel'附近使用正确的语法[CORE / cake / libs / model / datasources / dbo_source.php,第684行]   查询:loadModel

     

注意(8):未定义的属性:Group :: $ GroupRequest [APP / models / group.php,第124行]   致命错误:在第124行/home/wxworksmat/sspot3/app/models/group.php中的非对象上调用成员函数save()

我也尝试过使用App :: import:

App::import('Model','GroupRequest');

我没有以这种方式导入模型的任何SQL错误,但它仍然不起作用。我在save()或create()调用上得到以下错误:

  

致命错误:在第124行/home/wxworksmat/sspot3/app/models/group.php中的非对象上调用成员函数save()

4 个答案:

答案 0 :(得分:1)

您正在混淆控制器和模型方法

$this->loadModel()

是一种控制器方法,只能在那里使用。 你应该总是使用

$this->ModelName = ClassRegistry::init('ModelName');

其他地方

答案 1 :(得分:1)

我可能错了,请原谅我,如果我错了,但看起来你不太了解框架的概念。如果不给你一个完整的教程,很难回答你的问题。

这就是说,一切都依赖于模型关联。如果它正确完成,事情变得越来越容易。你应该阅读:

Associations: Linking Models Together

正确链接模型后,您将能够非常轻松地保存主模型以及相关模型。

Saving Related Model Data (hasOne, hasMany, belongsTo)

答案 2 :(得分:1)

据我了解,你是试图从模型中做到这一点?

class GroupRequest extends AppModel {

    public function associate($user, $group) {
        $data["GroupRequest"] = array("user_id" => $user, "group_id" => $group);
        $this->save($data);
    }

}

然后在你的Controller中(假设是group_requests_controller)

$this->GroupRequest->associate($user, $group);

如果你从另一个控制器调用它,你将首先加载模型

$this->loadModel("GroupRequests");
$this->GroupRequest->associate($user, $group);

但是,如果您在GroupRequests控制器中执行所有这些操作,则应该能够直接保存,而无需为其创建单独的方法

public function add() {
    $this->GroupRequest->create();
    $this->GroupRequest->save($this->data); #for < 2.0
}

您的观点应该是

<?php
    echo $this->Form->create("GroupRequest");
    echo $this->Form->input("user_id");
    echo $this->Form->input("group_id");
    echo $this->Form->end("Submit");
?>

答案 3 :(得分:0)

我遇到的问题是我的模型顶部没有正确的模型关联声明。

现在我有:

group.php

var $hasMany = 'GroupRequest';

group_request.php

var $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Group' => array(
        'className' => 'Group',
        'foreignKey' => 'group_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);
public function new_request($user, $group) {
    $data["GroupRequest"] = array("user_id" => $user, "group_id" => $group, 'status' => 'pending');

    if($this->save($data)){ return true;} else {return false;}
}

现在因为所有内容都设置为正确 ...我可以在我的group.php模型中执行此操作:

$this->GroupRequest->new_request($uid,$gid)

作为额外的奖励,因为关联正确填充,当我执行$ this-&gt;在我的组或用户模型中查找时,现在显示所有相关的GroupRequest条目。奖金数据FTW。