CakePhp3.x Обновление соединительной таблицы во множестве отношений
Я искал часы, и документация CakePhp3 не очень понятна для меня.
У меня есть приложение для чтения XML, и данные сохраняются или обновляются до CakePHP 3
У меня есть три модели (Свойства - Теги - OriginalImages), к которым добавлена связь "Имеет много" (я не использую отношение "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 расширяет таблицу {
/**
* 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, я добавляю теги Pool и Garage. Если я снова запускаю сценарий для чтения XML, я хочу изменить данные свойства (например, цену, это работает), но если пул тегов существует, не пишите его снова, но если есть новый тег (для Например, барбекю) добавить его. Результат, который мне нужен, будет
Свойство ID=20 с тегами, бассейн, гараж и барбекю. Тем не менее, я получил свойство id=20 с бассейном, гаражом, барбекю, бассейном, гаражом.
Я решил эту проблему вручную, удалив все теги при повторном обновлении свойства, но я думаю, что это не разумный способ сделать это, поэтому избегать повторения тега?
Могу ли я сделать метод для сравнения каждого тега с существующим, или CakePhp3.0 имеет какой-то способ сделать это?
Я думаю, что проблема в том, что данные находятся в другом месте, отличном от базы данных. Я не могу связать тег XML с существующим в БД, создающим новые элементы для сущности.
$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 );