MVC多模型数据导入(胖模型?)

时间:2010-09-20 17:37:41

标签: php model-view-controller cakephp import

我正在开发一个需要从单个CSV文件导入三个模型的数据的应用程序(具有一对多关联)。我已经建立了一个数据文件模型&控制器处理文件的上传/解析。现在,解析和保存记录的所有逻辑都在控制器中。这允许我保存到几个不同的模型,获取已保存记录的ID,并在解析文件时根据需要创建关联。

考虑到“胖模型,瘦控制器”的原理,我意识到我在控制器中有大约150行代码,它实际上只是处理数据。当我开始考虑将其移动到模型时,我得出结论,我必须将所有这些数据处理成数组(不知道关联ID),然后将其发送回控制器进行保存(因为模型不能从其他模型调用方法)。我期待导入文件中有大约1,500条记录。我正在使用CakePHP,它具有saveAll()方法,可以从一个阵列同时将数据保存到多个模型。

另一种选择是让三个模型中的每一个分别解析文件,忽略它不需要的任何数据。这应该是可能的,只要我按正确的顺序将它发送到模型,并给“belongsTo”模型一个可能相关的记录列表进行搜索。

那么 - 有关这些选项的任何建议吗?

  1. 将解析代码保留在数据文件控制器中。
  2. 将所有解析代码移动到数据文件模型,然后传回一个大数组以通过数据文件控制器保存。
  3. 将文件分别发送到三个模型中的每一个,以及用于确定关联的补充列表。

3 个答案:

答案 0 :(得分:1)

对于导入脚本,我总是喜欢shell脚本。控制器可能是放置复杂导入逻辑的最糟糕的地方,因为它几乎不可能重复使用。

如果从CLI运行脚本没有问题,请使用Shell。如果需要,您甚至可以从Web界面调用它 否则,将逻辑放入模型中,以便能够从Web和CLI调用它。

答案 1 :(得分:1)

我构建了与此类似的东西,但它不是特定于模型的。它允许您上载和下载在同一工作表中使用多个模型的csv表。我使用了一系列组件来调用我想要上传为CSV表格的模型。

我有一个rawdata组件,可以逐行处理文件。在每一行上,它对控制器进行回调,用于before_process_row和after_process_row等。控制器回调然后调用另一个组件,根据规则将数据拼接到不同的模型中。

我在模型中的唯一信息是csv文件中显示的字段以及文件头信息和其他搜索条件的规则。

它可能比您正在寻找的要复杂一些,但我选择了数据处理部件。

答案 2 :(得分:0)

这是一次只执行一次的操作吗?如果是这样,请编写一个脚本来执行此操作。否则....

我将所有数据导入主控制器,构建数据数组(格式与$this->data相同,然后使用saveAll或个人save保存哪个更合适。只要它与正确的关系得到保存,你的工作方式并不重要!

请记住在每一个之前做一个$this->myModel->create(),以确保您不会只有一行。