2011-12-07 87 views
1

我设置了一个用户/组系统,允许用户发送加入组的请求。如何加载相关模型并在CakePHP中保存相关数据?

我似乎无法加载关联的模型并添加一行。真的很难抵制只使用$ 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'; } 

下面是当我运行此我得到的错误:

Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'loadModel' at line 1 [CORE/cake/libs/model/datasources/dbo_source.php, line 684] Query: loadModel

Notice (8): Undefined property: Group::$GroupRequest [APP/models/group.php, line 124] Fatal error: Call to a member function save() on a non-object in /home/wxworksmat/sspot3/app/models/group.php on line 124

我也使用App ::进口尝试:

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

我没有以这种方式导入模型的任何SQL错误,但它仍然不起作用。我上保存(以下错误)或创建()调用:

Fatal error: Call to a member function save() on a non-object in /home/wxworksmat/sspot3/app/models/group.php on line 124

+0

您可以发布您的“Group”和“GroupRequest”模型定义吗? – Farray

+0

我同意Farray的暗示 - 有关模型设置的一些问题必须是错误的。 – Dave

+0

Dave和Farray你们都100%正确,请参阅下面提供的答案。 $ hasMany ='GroupRequest'是我所需要的。 – DirtyBirdNJ

回答

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) 

作为额外的奖励,因为关联设定适当填充,当我做这 - $>找到我的组或用户的模式,现在所有的相关GroupRequest条目显示出来。奖金数据FTW。

1

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

$this->loadModel() 

是一个控制器方法,只能有使用。 你应该总是使用

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

其他地方

+0

这工作,但不是我的问题 – DirtyBirdNJ

+0

“正确”的解决方案,那么是什么正确的解决方案呢? – mark

+0

请参阅下面的答案,我详细说明了添加到我的模型中的所有工作。正确的做法不是将模型加载到另一个模型中,而是正确设置关联,以便不需要加载模型与其进行交互。 – DirtyBirdNJ

1

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

这就是说,一切都依赖于模型关联。如果做得对,事情就变得简单了。你应该阅读:

Associations: Linking Models Together

一旦你有你的模型正确链接,你将能够保存的主要模式,以及相关的模型,非常容易。

Saving Related Model Data (hasOne, hasMany, belongsTo)

+0

绝对正确,我发表这篇文章的主要原因是因为我觉得自己在做一些根本性的错误。理解框架的一部分令人沮丧,并陷入其他部分。你假设这是一个模型关联问题是100%正确的,我只需要添加$ hasMany ='GroupRequest'。 – DirtyBirdNJ

1

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

class GroupRequest extends AppModel { 

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

} 
在控制器

然后(假设group_requests_controller)

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

如果你从另一个控制器调用这个你会loadModel第一

$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"); 
?> 
+1

您的评论非常有帮助,它使我对模型交互的正确思维模式感到满意,并向我展示了放置GroupRequest->添加逻辑的适当位置。 – DirtyBirdNJ