首页 文章

CakePHP保存非常深的相关模型

提问于
浏览
1

我有一个使用Party分析模式来简化关联的数据库(因为它必须在人和组织上存储信息,两者都有共同的属性) . 因此我的相关模型可以变得非常深 . 我的问题是保存数据的最佳方法是什么?例如,保存员工,Employee表没有直接连接到Party表,但是如果我将模型嵌入到这样的数组中:

array(
    'Party' => array(
        'Email' => array(...),
        'Address' => array(
            'Country' => array(...),
            'Location' => array(
                'State' => array(...)
            )
        ),
        'PhoneNumber' => array(...),
        'Person' => array(
            'Language' => array(...),
            'Skill' => array(...),
            'Employee' => array(
                'WorkHistory' => array(...),
                'Qualification' => array(...)
            )
        )
    )
)

我可以使用saveAll,它将保存所有内容 . 这意味着在我的表单上我有字段名称,例如Party.Person.Employee.start_time . 但是有人告诉我,这样做并不是真的遵循CakePHP惯例 . 另一种选择是让我的数组像这样:

array(
    'Party' => array(...)
    'Email' => array(...),
    'Address' => array(...),
    'Country' => array(...),
    'Location' => array(...),
    'PhoneNumber' => array(...),
    'Person' => array(...),
    'Language' => array(...),
    'Skill' => array(...),
    'Employee' => array(...),
    'WorkHistory' => array(...),
    'Qualification' => array(...)
)

但是,如果我在此调用saveAll,则不会保存所有内容,因为某些表/模型没有直接连接到Party . 保存这种结构的唯一方法就是使用Transactions .

所以我想知道CakePHP专家认为什么是处理需要保存非常深的相关模型的情况的最佳方法?

编辑:

根据我的反应,我可以收集的内容,对于您调用saveAll的模型,与其直接关联的其他模型不需要嵌套在该模型数组中 . 但是,如果您还想保存与其没有直接关联的模型,则需要将这些模型嵌套在与您调用saveAll的模型直接关联的模型中 . 对不起,我知道这很令人困惑,所以这里是根据这些信息修改后的阵列结构:

array(
    'Party' => array(...),
    'Email' => array(...),
    'Address' => array(
        'Country' => 'attribute',
        'Location' => 'attribute',
        'State' => 'attribute'
    ),
    'PhoneNumber' => array(...),
    'Person' => array(
        'Language' => array(...),
        'Skill' => array(...),
        'Employee' => array(
            'WorkHistory' => array(...),
            'Qualification' => array(...)
        )
    )
)

人与党直接关联,因此不需要在党内嵌套 . 但是,Employee(一种Person)并不直接与Party相关联,因此,当它在Party上调用saveAll时保存Employee数据时,它需要嵌套在Person中,因为Person模型直接与Party关联 . (仅供参考:Party有一个人和一个人有一个员工 . 这是我在数据库中构建继承结构的最好方法) . 通过这种方式构建它,应用程序既符合CakePHP标准,又以最小的努力保存数据 .

1 回答

  • 0

    好吧,解释有点在那里,它只是CakePHP约定,我们都知道什么时候不遵守约定会发生什么,对吧?

    正如我所说,遵循这些约定可以帮助CakePHP自动将所有内容粘合在一起,并且使用问题中显示的格式需要手动重构 Model::find() 调用所接收的数据 .

    因此,尽管您的问题中显示的结构可能适用于保存(至少目前为止),但它至少会为您带来一些实际上不必要的额外工作 .

    我承认我可能会更清楚,因为你似乎误解了我 . 我不想说数组应该完全是平的,只是错误地放置了 Person 条目,所以我只提到了一个 .

    当然最后一切都取决于关联的类型,链接文档中的所有内容都有例子:Cookbook > Models > Saving Your Data

    通常,只要没有任何HABTM关联来创建新记录而不是分配现有记录,您应该能够使用 saveMany()saveAssociated() 进行尽可能深的保存 .

    您可以通过参考 Model::find() 返回的结构开始,确保您保存在主模型上(在本例中为 Party ),并根据记录的关联/数量使用

    • save() (单条记录,无关联( HABTM 除外))

    • saveAll()saveManysaveAssociated 的包装)

    • saveMany() (多个主要模型记录,可能的关联(需要使用 deep 选项))

    • saveAssociated() (单个主要模型记录,包括关联(可能需要使用 deep 选项)

    然而,这可能不适用于所有情况,如上所述,您可能会遇到 HABTM 关联的问题,这取决于您是否要创建新记录,您可能需要单独保存它们,但这不是真正解释每个可能的情况,特别是因为Cookbook已经涵盖了基础知识 .

    我建议你学习文档,坚持惯例,通过尝试学习,并查看核心资源和测试,这就是我们每个人都学习它的方式 . 当你遇到问题时尚未涵盖的具体情况,只需创建一个新问题

相关问题