Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP保存非常深入的关联模型_Cakephp_Cakephp 2.3 - Fatal编程技术网

CakePHP保存非常深入的关联模型

CakePHP保存非常深入的关联模型,cakephp,cakephp-2.3,Cakephp,Cakephp 2.3,我有一个数据库,它使用政党分析模式来简化关联(因为它必须存储关于个人和组织的信息,两者都有共同的属性)。因此,我的相关模型可以深入研究。我的问题是保存数据的最佳方式是什么?以保存员工为例,员工表不直接连接到Party表,但是如果我将模型嵌套在如下数组中: array( 'Party' => array( 'Email' => array(...), 'Address' => array( 'Country' =&g

我有一个数据库,它使用政党分析模式来简化关联(因为它必须存储关于个人和组织的信息,两者都有共同的属性)。因此,我的相关模型可以深入研究。我的问题是保存数据的最佳方式是什么?以保存员工为例,员工表不直接连接到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\u 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,则不会保存所有内容,因为某些表/模型未直接连接到第三方。据我所知,保存这种结构的唯一方法是使用事务

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

编辑:

根据我所得到的响应,对于您正在调用saveAll的模型,直接关联到它的那些其他模型不需要嵌套在该模型数组中。但是,如果还希望保存与它没有直接关联的模型,则需要将这些模型嵌套在与调用saveAll on的模型直接关联的模型中。很抱歉,我知道这很混乱,因此根据这些信息,这里是我修改的数组结构:

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(...)
        )
    )
)

Person与Party直接关联,因此不需要嵌套在Party中。但是,Employee(人员的一种类型)与Party没有直接关联,因此,为了在调用Party上的saveAll时保存员工数据,需要将其嵌套在Person中,因为Person模型与Party直接关联。(仅供参考:一方只有一人,另一方只有一名员工。这是我能找到的在数据库中构建遗产结构的最佳方法)。通过这种方式构建,应用程序既符合CakePHP标准,又能以最小的努力保存数据。

好吧,解释就在这里,只是CakePHP约定,我们都知道不遵循约定会发生什么,对吗

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

因此,虽然你问题中的结构可能会节省(至少目前是这样),但它至少会给你带来一些实际上不必要的额外工作

我承认我本可以说得更清楚一点,因为你似乎误解了我。我不想说数组应该是平面的,只是
Person
条目被错误地放置了,所以我只提到了那个条目

当然,归根结底,这一切都取决于关联的类型,链接文档中的所有关联都有示例:

通常,只要不存在任何HABTM关联,您可以使用
saveMany()
saveAssociated()
创建新记录,而不是分配现有记录,就可以保存到所需的深度

首先,您可以参考由
Model::find()
返回的结构,确保保存在主模型上(在本例中为
Party
),并取决于使用的关联/记录数

  • save()

  • saveAll()
    (用于
    saveMany
    saveAssociated
    的包装器)

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

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

但是,这可能不适用于所有情况,如前所述,您可能会遇到
HABTM
关联的问题,这取决于您是否要创建新记录,您可能需要单独保存它们,但这并不是解释每种可能情况的真正地方,特别是因为本章已经介绍了基础知识食谱


我建议你研究文档,坚持惯例,通过尝试学习,并查看核心来源和测试,这就是我们每个人学习的方式。当你对尚未涉及的特定情况有问题时,只需创建一个新问题请给出为什么不使用第一种方法的理由?如果它有效,我会使用它。下面是我问的关于“Containable”的问题的链接,我试图按照视图中表单的方式格式化数组:所做的注释是“首先,为什么要反对CakePHP约定,这只会带来麻烦…”但没有解释。但是响应者并没有真正了解我为什么要这样构造数组。所以我想我应该检查它是否正确,或者是否有不应该这样做的原因。在烹饪书中说”为了保存一个记录及其相关记录,该记录具有多个超过两个级别的深度关联,数据数组应如下所示。。。"。然后给出了一个数组结构的示例,它看起来像我为这个问题提供的第一个示例。因此,基于此,虽然我的关联是hasOne,但我相信我是按照约定以该格式提交数组的。我发现,如果我不这样做,那么它就不会保存员工数据。再次感谢您的支持花时间帮我解决这个问题:)@user339