如何在cakephp中处理相关模型添加操作?

时间:2013-07-26 17:04:25

标签: php cakephp cakephp-2.0

我有两个模型,DealerDealerReview 我想创建一个表单来从DealersController,View动作中添加DealerReview。 在cakephp中实现这一目标的推荐方法是什么?我:

a)在DealersController视图操作中创建表单,但是将数据发布到DealerReviewsController添加操作?或者

b)将添加评论数据直接发布到DealersController,查看操作并从那里将记录添加到数据库中?

3 个答案:

答案 0 :(得分:0)

真的由你决定......

在选择其中一种方式时,您必须考虑的是:

表示a)
- 已经创建了与评论相关的经销商?如果没有,您将如何将外键dealer_id添加到DealerReviews以关联它们?

代表b)
- 如果没有创建经销商,这将使没有正确外键的麻烦无效(当然,如果您先添加经销商的创建) - 如果您打算从其他地方添加评论,则无法重复使用添加DealerReviews逻辑。

我通常做的只是将数据直接发布到主控制器(在这种情况下是经销商)。在添加评论之前,省去了检查经销商是否已正确保存和验证的麻烦。

如果在保存Review之前需要考虑业务逻辑(就像它只能在凌晨2点到凌晨3点之间保存(我知道愚蠢的例子)),那么我在beforeSave中添加验证。

如果它是一对一或两次的业务逻辑,我在模型中创建一个新函数saveButOnlyInSomeCasesLogic($reviewArray)并让它处理这些情况,控制器只调用该函数并等待结果。

总结:如果需要,请选择允许您重复使用代码的选项。如果您始终可以使用外键,请在评论控制器中执行此操作,您可能需要重复使用添加操作。如果您绝对不会重复使用添加操作,或者在保存时没有可用的外键,那么在经销商中,如果有的话,请在模型中保存逻辑。

答案 1 :(得分:0)

使用您的关联来保存它。你可以说经销商有很多经销商评论。所以在这种情况下,我只需从您的dealerController视图中调用save。

$this->Dealer->DealerReview->save($this->request->data);

通过这种方式,您的表单可以像您所希望的那样位于dealerController中。

答案 2 :(得分:0)

我想补充一下,取决于具体的用例。

原因如下:

如果审核表单包含多个字段(但即使您有单个textarea用于审核,您至少需要验证用户是否提交空审核)。如果是这样,出错时,您需要返回相同的表单(预先填充发布的数据)并最终返回到同一页面。因此,在同一操作中发布表单将作为普通的添加或编辑表单。

或者,如果您使用的是ajax表单提交,那么我将使用DealersController:add()方法以及将在原始表单的位置呈现调用的响应,但这次出现验证错误。它需要稍微调整一下,因为您需要检测调用是否来自ajax,因此您不会将add操作重定向到索引。这里最大的好处是用户不需要刷新页面。

所以,如果你不使用ajax,我会说 - 在DealersController :: view()中发帖,但是如果你使用ajax,那么使用DealersReviewsController :: add()和你会更有用重用该方法以及用户无需刷新页面。

正如@Nunser所说 - 这取决于你。 :)