【问题标题】:How do I handle a related models add action in cakephp?如何在 cakephp 中处理相关模型添加操作?
【发布时间】:2013-07-27 09:22:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: php cakephp cakephp-2.0


    【解决方案1】:

    真的取决于你...

    在选择一种或另一种方式时,您必须牢记的是:

    a)
    - 与评论相关的经销商是否已经创建?如果没有,您将如何将外键dealer_id 添加到DealerReviews 以关联两者?

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

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

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

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

    总结:选择让您在需要时重用代码的选项。如果您始终拥有可用的外键,请在 Review 控制器中执行此操作,您可能需要重用 add 操作。如果您绝对不会重用添加操作或在保存时没有可用的外键,请在 Dealers 中将其保存,如果有的话,请在模型中保留保存逻辑。

    【讨论】:

    • 我想让代码尽可能的干净和干燥。有没有办法我可以在DealerReviews 控制器中定义添加操作并使用来自DealersController 的发布数据调用它?我研究了 Controller:: requestAction()。但他们建议不要这样做
    • requestAction 是不明智的,因为它“反对”当前(从视图调用控制器,不不)。如果您更改表单发布到的操作,您可以从DealersController 中的视图调用DealerReviews 中的添加操作。如果您想要 DRY,请在接收 $a['DealerReview'] 数组的 DealerReviews 模型中创建一个 addReview 操作,并从 DealersController 的操作中调用该函数。如果您将添加代码保持封装,则无需在之后重复,如果您想在另一个视图中添加评论,则必须从另一个操作中调用该函数。
    【解决方案2】:

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

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

    这样你的表单就可以像你想要的那样在dealersController中。

    【讨论】:

      【解决方案3】:

      我会补充,取决于具体的用例。

      原因如下:

      如果评论表单包含多个字段(但即使您有一个用于评论的文本区域,您也需要至少在用户提交空评论时进行验证)。如果是这样,则在出错时,您需要返回相同的表单(预先填充了已发布的数据)并最终在同一页面上。因此,以相同的操作发布表单将充当正常的添加或编辑表单。

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

      所以,如果你不使用 ajax,我会说 - 在 DealersController::view() 中发布,但如果你使用 ajax,那么使用 DealersReviewsController::add() 会更有用,而你正在重用该方法,并且用户不必刷新页面。

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

      【讨论】:

      • 我想让代码尽可能的干净和干燥。有没有办法我可以在DealerReviews 控制器中定义添加操作并使用来自DealersController 的发布数据调用它?我研究了 Controller:: requestAction()。但他们建议不要这样做
      • requestAction 不推荐,但它很有用。我会按照上面的说明进行 ajax 提交。然后一切都将在适当的控制器中。
      猜你喜欢
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多