CakePhp3.x更新连接表有很多关系

时间:2017-07-05 08:19:32

标签: php cakephp-3.x

我正在寻找几个小时,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 ); 

0 个答案:

没有答案