我有两个模型,Dealer
和DealerReview
我想创建一个表单来从DealersController,View动作中添加DealerReview。
在cakephp中实现这一目标的推荐方法是什么?我:
a)在DealersController视图操作中创建表单,但是将数据发布到DealerReviewsController
添加操作?或者
b)将添加评论数据直接发布到DealersController
,查看操作并从那里将记录添加到数据库中?
答案 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所说 - 这取决于你。 :)