我正在开发一个需要从单个CSV文件导入三个模型的数据的应用程序(具有一对多关联)。我已经建立了一个数据文件模型&控制器处理文件的上传/解析。现在,解析和保存记录的所有逻辑都在控制器中。这允许我保存到几个不同的模型,获取已保存记录的ID,并在解析文件时根据需要创建关联。
考虑到“胖模型,瘦控制器”的原理,我意识到我在控制器中有大约150行代码,它实际上只是处理数据。当我开始考虑将其移动到模型时,我得出结论,我必须将所有这些数据处理成数组(不知道关联ID),然后将其发送回控制器进行保存(因为模型不能从其他模型调用方法)。我期待导入文件中有大约1,500条记录。我正在使用CakePHP,它具有saveAll()
方法,可以从一个阵列同时将数据保存到多个模型。
另一种选择是让三个模型中的每一个分别解析文件,忽略它不需要的任何数据。这应该是可能的,只要我按正确的顺序将它发送到模型,并给“belongsTo”模型一个可能相关的记录列表进行搜索。
那么 - 有关这些选项的任何建议吗?
答案 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()
,以确保您不会只有一行。