我正在寻找几个小时,CakePhp3的文档对我来说不是很清楚。
我有一个用于读取XML的应用程序,数据已保存或更新到CakePHP 3
我有三个模型(属性 - 标签 - 原始图像)由多个关系连接(我没有使用ManyToMany关系,因为我需要另一个字段)。当我使用新标签创建属性时,我没有遇到任何问题。该属性已正确添加和标签。
class PropertyTagsTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('property_tags');
$this->setDisplayField('name');
$this->setPrimaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Properties', [
'foreignKey' => 'properties_id',
'joinType' => 'INNER'
]);
}
类PropertiesTable扩展了Table {
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('properties');
$this->setDisplayField('name');
$this->setPrimaryKey('id');
$this->addBehavior('Timestamp');
$this->hasMany('ImagesAffiliates', [
'foreignKey' => 'property_id'
]);
$this->hasMany('OriginalImages', [
'foreignKey' => 'property_id'
]);
$this->hasMany('PropertyTags', [
'foreignKey' => 'property_id'
]);
}
当我尝试更新连接数据时会出现问题,因为CakePHP始终认为新数据是新标记,再次将标记添加到property_tags表中。
例如,当我创建ID = 20的Property时,我添加了标签Pool和Garage。如果我再次运行脚本来读取XML,我想修改属性数据(例如价格,这是有效的)但是如果标签池存在,请不要再次写入,但是如果有新标签(例如,烧烤)添加它。我需要的结果将是
属性ID = 20,包含标签,游泳池,车库和烧烤。但是,我得到了属性id = 20与池,车库,烧烤,游泳池,车库。
我手动解决了这个问题,当我再次更新属性时删除所有标签,但我认为这不是明智的方法,所以避免重复标签?
我可以创建一个方法来比较每个标记与现有标记,还是CakePhp3.0有一些方法可以做到吗?
我认为问题就像数据位于另一个与数据库不同的地方我无法将XML标记与db中存在的新元素创建实体相关联。
$properties = $this->loadModel('Properties');
$query = $properties->find('all')->where( ['listing_identifier' => $xmlProperty["listing_identifier"] ] );
if ( $query->first() <> NULL ){ //Exists we update the data
$property = $query->first();
$property = $this->Properties->get($property->id, [
'contain' => ['OriginalImages', 'PropertyTags']
]);
$this->Properties->PropertyTags->deleteAll( [ 'property_id' => $property->id ] ); //Deleting manually the tags.
try {
$property2 = $this->Properties->patchEntity( $property, $xmlProperty, ['associated'=>['PropertyTags', 'OriginalImages'] ] );
$this->Properties->save( $property ); //Update
}
catch (Exception $e) {
}
}
else { //Not exists we create a new one property
$property = $this->Properties->patchEntity($property, $xmlProperty, [
'associated' => ['OriginalImages', 'PropertyTags'] ]);
$property = $this->Properties->save( $property );