【问题标题】:CakePHP 3.0 association being marked as dirty when it's actually cleanCakePHP 3.0 关联在实际干净时被标记为脏
【发布时间】:2015-06-22 00:08:34
【问题描述】:

我正在尝试更新/保存可以关联多个地址 (TradingPartnerAddresses) 的 TradingPartner 实体(客户和供应商)。

我有一组更改的 TradingPartners,我正在使用 Cake 的 patchEntities() 函数将现有记录与修改后的记录合并。

问题是 Cake 错误地将关联地址标记为脏地址,并且在循环遍历实体以保存它们时,它试图重新插入现有地址 - 导致地址重复。

代码如下:

贸易伙伴控制器

//Load the trading partners model
$tradingPartners = TableRegistry::get('TradingPartners');

//find all existing trading partners and their associated addresses
$currentTradingPartners = $tradingPartners->find('all')
                                     ->contain(['TradingPartnerAddresses']);

//Patch trading partner changes
//Cake automagically handles 1 level of associations
$patchedTpEntities = $tradingPartners->patchEntities($currentTradingPartners, $partners);

//loop through and save all dirty fields
foreach ($patchedTpEntities as $tpEntity) {
   if ($tradingPartners->save($tpEntity)) {
   } else {
      //TODO
   }
}

贸易伙伴表

public function initialize(array $config) {
    $this->primaryKey('partner_code');

    $this->hasMany('TradingPartnerAddresses', [
        'foreignKey' => 'partner_code'
    ]);
}

贸易伙伴地址表

public function initialize(array $config) {
    $this->entityClass('App\Model\Entity\TradingPartnerAddress');
    $this->belongsTo('TradingPartners', [
        'foreignKey' => 'partner_code'
    ]);
}

调试($patchedEtentites);

(int) 0 => object(App\Model\Entity\TradingPartner) {

    .....

    'trading_partner_addresses' => [],
    '[new]' => false,
    '[accessible]' => [
        '*' => true
    ],
    '[dirty]' => [
        'trading_partner_addresses' => true
    ],
    '[original]' => [],
    '[virtual]' => [],
    '[errors]' => [],
    '[repository]' => 'TradingPartners'

有什么想法可以解释为什么 trading_partner_addresses 在它实际上是干净的时候被标记为脏的?

【问题讨论】:

    标签: cakephp model-view-controller cakephp-3.0 saving-data


    【解决方案1】:

    当你用一些数据修补实体时,它会自动标记为脏

    $tradingPartners->patchEntities($currentTradingPartners, $partners);
    

    这意味着您正在使用 $partners 数据更新 $currentTradingPartners,因此 $currentTradingPartners 被修改并标记为脏。

    如果你想要原始数据,你可以在你的实体属性上使用 getOriginal 方法,你也可以使用 clean 方法删除脏标志。

    如果你在用关联修补实体时遇到问题,你必须在 patchEntity 中传递一组选项:

    $article = $articles->get(1);
    $articles->patchEntity($article, $this->request->data(), [
      'associated' => ['Tags', 'Comments.Users']
    ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-25
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多