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

如何在CakePHP中加载相关模型并保存相关数据?,cakephp,model,save,Cakephp,Model,Save,我正在设置一个用户/组系统,允许用户发送加入组的请求 我似乎无法加载关联模型并添加行。要想抵制只使用$this->query()并完成它的冲动真的很难。。。但我正在努力学习蛋糕惯例,并以正确的方式做事 在my group model处理组加入请求的功能中: $this->loadModel('GroupRequest'); $this->data = array('GroupRequest' => array('user_id' => $uid, 'group_id'

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

我似乎无法加载关联模型并添加行。要想抵制只使用$this->query()并完成它的冲动真的很难。。。但我正在努力学习蛋糕惯例,并以正确的方式做事

在my group model处理组加入请求的功能中:

$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行[CORE/cake/libs/model/datasources/dbo_source.php,第684行]的“loadModel”附近使用的正确语法 查询: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()


您混淆了控制器和模型方法

$this->loadModel()
是控制器方法,只能在此处使用。 你应该始终使用

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

其他地方

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

也就是说,一切都依赖于模型关联。如果做得正确,事情就会变得容易。你应该读到:

一旦正确链接了模型,就可以非常轻松地保存主模型和相关模型


据我所知,您试图从模型内部执行此操作

class GroupRequest extends AppModel {

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

}
然后在控制器中(假设组请求控制器)

如果您是从另一个控制器调用此函数,则应首先加载模型

$this->loadModel("GroupRequests");
$this->GroupRequest->associate($user, $group);
然而,如果您在GroupRequests控制器中执行所有这些操作,您应该能够直接保存,而无需为其创建单独的方法

public function add() {
    $this->GroupRequest->create();
    $this->GroupRequest->save($this->data); #for < 2.0
}
公共函数添加(){
$this->GroupRequest->create();
$this->GroupRequest->save($this->data);#用于<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");
?>

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

现在我有:

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)

另外一个好处是,由于Association正在正确填充,当我在我的组或用户模型中执行$this->find时,现在所有相关的GroupRequest条目都会显示出来。奖金数据FTW。

您可以发布您的
组请求
模型定义吗?我同意Farray的含沙射影-模型的设置方式一定有问题。Dave和Farray您都是100%正确的,请参阅下面提供的我的答案$hasMany='GroupRequest'是我所需要的一切。你的评论非常有用,它让我树立了正确的模型交互思维,并向我展示了放置GroupRequest->add logic的正确位置。绝对正确,我发表这篇文章的主要原因是因为我觉得我做了一些根本错误的事情。理解框架的一部分,却被其他部分卡住,这是令人沮丧的。您认为这是一个模型关联问题的假设是100%正确的,添加$hasMany='GroupRequest'就是我所需要的。请参阅下面的答案,我详细说明了添加到模型中的内容,以使其能够正常工作。正确的方法是不要在另一个模型中加载一个模型。。。但是要正确设置关联,这样您就不需要加载模型来与之交互。很好-是的,这是您首先应该做的:)
$this->GroupRequest->new_request($uid,$gid)