CakePHP 3.0 关联在实际干净时被标记为脏
CakePHP 3.0 association being marked as dirty when it's actually clean
我正在尝试 Update/Save 可以关联许多地址 (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
}
}
贸易伙伴Table
public function initialize(array $config) {
$this->primaryKey('partner_code');
$this->hasMany('TradingPartnerAddresses', [
'foreignKey' => 'partner_code'
]);
}
贸易伙伴地址Table
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 在实际上是干净的时候却被标记为脏的吗?
当你用一些数据修补实体时,它会自动标记为脏
$tradingPartners->patchEntities($currentTradingPartners, $partners);
这意味着您正在使用 $partners 数据更新 $currentTradingPartners,因此 $currentTradingPartners 被修改并标记为脏。
如果你想要原始数据,你可以在你的实体属性上使用 getOriginal 方法,你也可以使用 clean 方法删除脏标志。
如果您在修补具有关联的实体时遇到问题,您必须在 patchEntity 中传递一组选项:
$article = $articles->get(1);
$articles->patchEntity($article, $this->request->data(), [
'associated' => ['Tags', 'Comments.Users']
]);
我正在尝试 Update/Save 可以关联许多地址 (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
}
}
贸易伙伴Table
public function initialize(array $config) {
$this->primaryKey('partner_code');
$this->hasMany('TradingPartnerAddresses', [
'foreignKey' => 'partner_code'
]);
}
贸易伙伴地址Table
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 在实际上是干净的时候却被标记为脏的吗?
当你用一些数据修补实体时,它会自动标记为脏
$tradingPartners->patchEntities($currentTradingPartners, $partners);
这意味着您正在使用 $partners 数据更新 $currentTradingPartners,因此 $currentTradingPartners 被修改并标记为脏。
如果你想要原始数据,你可以在你的实体属性上使用 getOriginal 方法,你也可以使用 clean 方法删除脏标志。
如果您在修补具有关联的实体时遇到问题,您必须在 patchEntity 中传递一组选项:
$article = $articles->get(1);
$articles->patchEntity($article, $this->request->data(), [
'associated' => ['Tags', 'Comments.Users']
]);