设计最佳实践 - 模型与控制器与UI - CakePHP,MySQL

时间:2014-11-25 07:55:29

标签: mysql cakephp design-patterns

我一直在努力解决这个问题,最后在这个网站上寻求专家和观众的意见。

  1. 我有两个表 - 一个是工作流步骤的模板,另一个是称为事件的这些工作流步骤的实例。模板表包含步骤名称,步骤类型等信息 - 非常通用的信息。事件表包含一个返回工作流步骤表的参考链接和一个名为notes的附加列 - 它存储用户在记录特定工作流步骤时记录的数据。工作流程步骤和事件都链接到网站上的POST

  2. 工作流程步骤模板可以在没有事件发生的情况下存在 - 即用户可能仍处于步骤3或步骤5并且未记录步骤1,2,4的事件 - 基本上步骤顺序仅为暗示但不具约束力。工作流程步骤有一个序列字段,用于指示它们在屏幕上显示的顺序。

  3. 事件也可以在没有工作流程步骤的情况下发生 - 换句话说,用户可以在工作流程步骤的上下文之外记录注释。这些是通用事件,与POST

  4. 直接相关
  5. 我能够成功检索给定POST的这两个值 - 它们被检索为两个单独的数组。我正在使用CakePHP和MySQL

  6. 用户界面需要呈现一个屏幕,按顺序显示所有工作流程步骤以及与这些步骤相关或在这些步骤之外发生的相应事件。屏幕的排序主要由工作流程步骤序列驱动,其次由created_date驱动,用于那些与特定工作流程步骤无关的事件

  7. 问题陈述 - 1.我是否向UI发送两个单独的数组(如#4中所述),并让UI确定如何交织步骤和事件以进行显示的复杂逻辑? 2.我是否在控制器中处理步骤和事件的交织,然后向UI发送一个可以循环显示的简单数组? 3.我尝试将此逻辑移到数据库中,但由于#2和#3中解释的变化,它变得非常复杂

    我正在寻求建议,从设计实践和简化的角度来看哪个更好。我知道我在这里给出了一个有限的图片,但我希望本网站上的某个人可能在其他地方遇到过类似的问题。

2 个答案:

答案 0 :(得分:0)

根据您向用户分配事件的方式,我会在Event to Workflow中建立一个hasOne关系。您需要为您的用户提供另一种关系,hasOne或hasMany。

$hasOne = 'Workflow';

显然,这意味着您的Event表会有一个名为wordflow_id的列,并且会与工作流中的单行相关联。在控制器中,我将由用户调用事件。

$this->Event->findAllByUserId($user_id);

这应该为您提供一个看起来像这样的数组。

array(
    [0] => array(
        [Event] => array(
            'id' => 1,
            'name' => 'blah',
            ...
        ),
        [User] => array(
            'id' => 1,
            'name' => 'Charles',
            ...
        ),
        [Workflow] => array(
            [0] => array(
                'id' => 1,
                'name' => 'more blagblagblag',
                ...
            ),
            [1] => array(
                'id' => 9,
                'name' => 'sblagblsagblag',
                ...
            ),
            [2] => array(
                'id' => 42,
                'name' => 'mordse d',
                ...
            )
        )
    )
)

调用所有工作流程模板

$this->Workflow->find('all');

然后我会使用SET :: features内置的用户蛋糕在您的视图中打印工作流模板,并使用您的事件调用来填充数据。

请发布更多详细信息以及您的代码,型号等,我们确信我们可以为您提供实现此目的所需的确切查询/逻辑。

http://book.cakephp.org/2.0/en/core-utility-libraries/set.html

答案 1 :(得分:0)

好的 - 我已经解决了这个问题。我最终将功能移到模型中。

  1. 我创建了两个SQL查询 - 一个检索所有工作流程步骤以及可能与每个步骤相关联的任何事件信息。
  2. 然后我创建了第二个SQL,它检索所有那些独立且与任何特定工作流步骤无关的事件
  3. 我使用UNION ALL将它们叠加在一起
  4. 我在修改日期和序列号上使用了SORT,以便所有步骤和事件按时间顺序和顺序显示
  5. 然后我将它从Model传递给View(通过控制器)并让View迭代并显示元素。这种方法实际上极大地简化了我的View和Controller代码,甚至模型代码也非常简单,因为它只是一个带参数的查询语句。