CakePHP 使用 3 个带有 saveAll 的模型

Posted

技术标签:

【中文标题】CakePHP 使用 3 个带有 saveAll 的模型【英文标题】:CakePHP use 3 models with saveAll 【发布时间】:2010-08-05 06:53:28 【问题描述】:

我有以下情况:

我正在开发一个地址应用程序来存储我们客户的详细信息。

我有以下数据库结构:

Clients hasMany Addresses
Addresses belongsTo Client
Addresses hasMany AddressEmails and AddressPhones

如果现在有人添加了新客户,则应保存他的主要地址以及 1 个电子邮件和 1 个电话号码。

如果我在客户端的添加视图中使用以下代码执行此操作并在客户端控制器中调用 saveAll 方法,部分效果会非常好:

 <?php
  echo $this->Form->input('client_group_id');
  echo $this->Form->input('company');
  echo $this->Form->input('firstname');
  echo $this->Form->input('lastname');
  echo $this->Form->input('www');
  echo $this->Form->input('Address.0.is_standard', array('type' => 'hidden', 'value' => '1'));
  echo $this->Form->input('Address.0.street');
  echo $this->Form->input('Address.0.zip');
  echo $this->Form->input('Address.0.city');
 ?>

但我不知道如何通过此视图保存电子邮件和电话号码。尝试过像 AddressEmail.0.email 这样的想法,但没有奏效。


知道了:

使用 Nik 发布的解决方案运行良好,我现在调用 $this->Client->Address->saveAll($this->data) 但必须像这样调整我的添加视图:

<?php
    echo $this->Form->input('client_group_id');
    echo $this->Form->input('company');
    echo $this->Form->input('firstname');
    echo $this->Form->input('lastname');
    echo $this->Form->input('www');
    echo $this->Form->input('Address.is_standard', array('type' => 'hidden', 'value' => '1'));
    echo $this->Form->input('Address.street');
    echo $this->Form->input('Address.zip');
    echo $this->Form->input('Address.city');
    echo $this->Form->input('AddressEmail.0.type', array('type' => 'hidden', 'value' => 'Standard'));
    echo $this->Form->input('AddressEmail.0.email');
    echo $this->Form->input('AddressPhone.0.type', array('type' => 'hidden', 'value' => 'Standard'));
    echo $this->Form->input('AddressPhone.0.number');
?>

由于我现在从地址模型调用 saveAll() 方法,因此不再需要零!

【问题讨论】:

这是旧帖子,但真正解决了我的问题。非常感谢! 这里也一样!!这个旧帖子拯救了我的一天!谢谢 【参考方案1】:

使用 saveAll() 保存相关数据仅适用于直接关联的模型。

所以基本上你可以用 saveAll() 客户端(作为主要模型)和地址来保存。您可以通过 Adress 模型保存的电子邮件和电话,例如:

$this->Client->saveAll($data); //This saves Client and Address
$this->Client->Address->saveAll($data); //This saves Email and Phone

我没有测试它,但它应该可以这样工作。 (假设您的字段遵循如下命名约定:

echo $this->Form->input('Email.0.field');
echo $this->Form->input('Email.1.field');
echo $this->Form->input('Email.2.field');
echo $this->Form->input('Phone.0.number');
echo $this->Form->input('Phone.1.number');
echo $this->Form->input('Phone.2.number');

我不确定它是否会直接“捕获”地址 ID,但您可以尝试。

另一种方法是从

中保存模型
$this->Client-Address->saveAll($data);

仅限。这样所有相关模型都将被保存(根据文档 - 请先查看)。

【讨论】:

您好 Nik,谢谢您,这是一个很好的观点!不幸的是,如果我使用第一个版本,它会两次保存客户端,但关系是正确的。如果我只使用第二个版本,一切都好,但它不会保存地址详细信息。记录已创建但未保存。 cakephp 3.x 中有什么方法可以保存所有关联的表吗?

以上是关于CakePHP 使用 3 个带有 saveAll 的模型的主要内容,如果未能解决你的问题,请参考以下文章

避免 CakePHP 的 saveAll 并使用手动查询

CakePHP 使用 saveAll:如何使用 HABTM 链接记录保存额外数据?

CakePHP:用户数据 saveAll 静默失败?

cakephp:使用 saveAll(),导入的(非表单相关的)关联数据不保存

CakePHP saveAll 方法

在 CakePHP 中使用 saveAll() 保存多个 hasMany 数据,而无需在视图中写入 id