Php MVC多模型数据导入(fat模型?)

Php MVC多模型数据导入(fat模型?),php,model-view-controller,cakephp,import,Php,Model View Controller,Cakephp,Import,我正在开发一个应用程序,需要从一个CSV文件(具有一对多关联)导入三个模型的数据。我已经设置了一个数据文件模型和控制器来处理文件的上传/解析。现在,解析和保存记录的所有逻辑都在控制器中。这允许我保存到几个不同的模型,获取保存的记录的ID,并在解析文件时根据需要创建关联 考虑到“胖模型,瘦控制器”的原理,我意识到我在一个控制器中有大约150行代码,它实际上只是处理数据。但是,当我开始考虑将其移动到模型时,我得出结论,我必须将所有这些数据处理到数组中(不知道关联ID),并将其发送回要保存的控制器(因

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

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

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

那么,对这些选项有什么建议吗

  • 让数据文件控制器中的解析代码保持原样
  • 将所有解析代码移到数据文件模型,然后通过数据文件控制器传回要保存的大型数组
  • 将文件分别发送给三个模型中的每一个,以及确定关联的补充列表

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

    我会将所有数据导入主控制器,构建数据数组(与
    $this->data
    的格式相同),然后使用
    saveAll
    或单个
    save
    保存它,具体取决于哪个更合适。只要使用正确的关系保存它,如何保存其实并不重要


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

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

    如果从CLI运行脚本没有问题,请使用。如果需要,您甚至可以从web界面调用它。

    否则,将逻辑放入模型中,以便能够从web和CLI调用它。

    我构建了类似的功能,但它不是特定于模型的。它允许您上载和下载在同一个表中使用多个模型的csv表。我使用了一系列组件,这些组件称为我想作为csv表上载的模型

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

    我在模型中仅有的信息是csv文件中显示哪些字段的规则、文件头信息和其他搜索条件


    它可能比您想要的要复杂一些,但我使用了数据处理部分的组件。

    我希望客户端能够在必要时多次执行此操作(例如,如果他们对数据文件进行了更正),但这不是一个常规的工作。所以你不认为有什么特别的理由把所有这些代码放在一个模型中而不是一个控制器中吗?我现在已经按照我想要的方式工作了,但我觉得我打破了“瘦控制器”的原则。谢谢deceze…我确实想使用web界面(或者更确切地说,我希望客户能够使用它)。我没有想到创建shell,这是我以前在Cake中没有做过的。我不知道如何在手册中从控制器调用shell…您将如何做到这一点?@hands您可以像在CLI上一样使用其中一个命令启动它。但是如果您计划经常这样做,您应该对代码进行结构化,以便能够简单地在PHP中调用函数,即将逻辑放入模型中。谢谢,这是一个好主意。它听起来确实比我看到的要复杂,但值得记住。