如果加入的实体是新创建的,如何保存附加数据以加入 Table

How to save additional data to join Table if joined entities are created new

我正在尝试将其他数据保存到 belongsToMany 连接 Table。 我遵循了说明 here 但它们只是为了防止实体已经存在,因为它似乎使用了一个 id。但是我的实体应该是新创建的,并且应该保存额外的连接数据。 我的保存数据看起来像这样。一切都很好,除了附加字段 'type_keys'

(int) 0 => object(Cloud\Model\Entity\MediaObject) {

        'media_object_type_id' => 'image',
        'title' => '1482842705_1_749145',
        'relative_path' => '/optional_images/1/1/',
        'extension' => 'jpg',
        'size' => (int) 142683,
        'original_title' => 'logo.jpg',
        '_joinData' => [
            'type_key' => 'optional_image_1'
        ],
        '[new]' => true,
        '[accessible]' => [
            '*' => true
        ],
        '[dirty]' => [
            'media_object_type_id' => true,
            'title' => true,
            'relative_path' => true,
            'extension' => true,
            'size' => true,
            'original_title' => true,
            '_joinData' => true
        ],
        '[original]' => [],
        '[virtual]' => [],
        '[errors]' => [],
        '[invalid]' => [],
        '[repository]' => 'Cloud.MediaObjects'

    }

不幸的是,只有连接 table 中的连接 ID 被保存,但没有保存 joinData 字段 'type_keys'

如果有人能给我线索,我会很高兴。

在进一步测试中,我发现连接数据在保存时会被覆盖。 供您参考:我在 beforeSave 回调中设置媒体对象加入数据。

object(Cloud\Model\Entity\Touchpoint) {

'title' => 'test',
'user_id' => (int) 1,
'tp_image' => [
    'name' => '',
    'type' => '',
    'tmp_name' => '',
    'error' => (int) 4,
    'size' => (int) 0
],
'optional_image_1' => [
    'name' => 'logo.jpg',
    'type' => 'image/jpeg',
    'tmp_name' => '/tmp/phpMeTwuQ',
    'error' => (int) 0,
    'size' => (int) 142683
],
'created' => object(Cake\I18n\Time) {

    'time' => '2016-12-27T13:19:03+00:00',
    'timezone' => 'UTC',
    'fixedNowTime' => false

},
'modified' => object(Cake\I18n\Time) {

    'time' => '2016-12-27T13:19:03+00:00',
    'timezone' => 'UTC',
    'fixedNowTime' => false

},
'brand_id' => (int) 1,
'media_objects' => [
    (int) 0 => object(Cloud\Model\Entity\MediaObject) {

        'media_object_type_id' => 'image',
        'title' => '1482844743_1_988232',
        'relative_path' => '/optional_images/1/1/',
        'extension' => 'jpg',
        'size' => (int) 142683,
        'original_title' => 'logo.jpg',
        '_joinData' => object(Cake\ORM\Entity) {

            'touchpoint_id' => (int) 8,
            'media_object_id' => (int) 8,
            '[new]' => false,
            '[accessible]' => [
                '*' => true
            ],
            '[dirty]' => [],
            '[original]' => [],
            '[virtual]' => [],
            '[errors]' => [],
            '[invalid]' => [],
            '[repository]' => 'MediaObjectsTouchpoints'

        },
        'created' => object(Cake\I18n\Time) {

            'time' => '2016-12-27T13:19:03+00:00',
            'timezone' => 'UTC',
            'fixedNowTime' => false

        },
        'modified' => object(Cake\I18n\Time) {

            'time' => '2016-12-27T13:19:03+00:00',
            'timezone' => 'UTC',
            'fixedNowTime' => false

        },
        'id' => (int) 8,
        '[new]' => false,
        '[accessible]' => [
            '*' => true
        ],
        '[dirty]' => [],
        '[original]' => [
            '_joinData' => [
                'type_key' => 'optional_image_1'
            ]
        ],
        '[virtual]' => [],
        '[errors]' => [],
        '[invalid]' => [],
        '[repository]' => 'Cloud.MediaObjects'

    }
],
'id' => (int) 8,
'[new]' => false,
'[accessible]' => [
    '*' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Cloud.Touchpoints'

}

所以我知道它会被覆盖,但我不确定如何以正确的方式做到这一点?

好的,我现在找到了解决方案。

自从我看到一个实体被创建为 _joinData 我自己创建了一个实体并自己在实体中设置了 属性,这样 _joinData 不会被替换,而只是用 ID 丰富。

$joinTable = TableRegistry::get('MediaObjectsTouchpoints');
$newMediaObject->_joinData = $joinTable->newEntity();

$newMediaObject->_joinData->type_key = 'something';

$entity->media_objects[] = $newMediaObject;