蛋糕PHP3.4:不明白错误保存一个属于多关联



我尝试以一种形式输入belongsToMany关联,但相当特定的关联描述。
因为我的实体Site可以使用2种不同用法的语言,所以我使用2个加入表。
所以模式是以下

Relationship                        Join Table Fields
Sites belongsToMany Vislanguages    sites_vislanguages.id, sites_vislanguages.language_id, sites_vislanguages.site_id
Relationship                        Join Table Fields
Sites belongsToMany Reclanguages    sites_reclanguages.id, sites_reclanguages.language_id, sites_reclanguages.site_id

所以Table类是:

class VislanguagesTable extends Table {
    public function initialize(array $config) {
        parent::initialize($config);
        $this->table('languages');
        $this->displayField('name_fr');
        $this->primaryKey('id');
        $this->belongsToMany('Sites', [
            'foreignKey' => 'language_id',
            'targetForeignKey' => 'site_id',
            'joinTable' => 'sites_vislanguages',
        ]);
    }
}
class SitesTable extends Table {
public function initialize(array $config) {
    parent::initialize($config);
    $this->belongsToMany('Reclanguages', [
        'joinTable' => 'sites_reclanguages',
        'className' => 'Languages',
        'propertyName' => 'reclanguages'
    ]);
    $this->belongsToMany('Vislanguages', [
        'joinTable' => 'sites_vislanguages',
        'className' => 'Languages',
        'propertyName' => 'vislanguages'
    ]);
}

class siteSvislanguageStable扩展表{

public function initialize(array $config) {
    parent::initialize($config);
    $this->table('sites_vislanguages');
    $this->displayField('id');
    $this->primaryKey('id');
    $this->belongsTo('Sites', [
        'foreignKey' => 'site_id',
    ]);
    $this->belongsTo('Languages', [
        'foreignKey' => 'language_id',
    ]);
}

i当然有addedit表格的问题,但我以edit的示例为例。如果我 find()已准备就绪的site,则数据结构为:

object(AppModelEntitySite) {
    'id' => (int) 23098,
    'Vislanguages' => [
        (int) 0 => object(AppModelEntityLanguage) {
            'id' => (int) 1,
            '_joinData' => object(AppModelEntitySitesVislanguage) {
                'id' => (int) 4409,
                'site_id' => (int) 23098,
                'language_id' => (int) 1,
                ...,
                '[repository]' => 'SitesVislanguages'
            },
            ...,
            '[repository]' => 'Vislanguages'
        },
        (int) 1 => object(AppModelEntityLanguage) {
            'id' => (int) 9,
            '_joinData' => object(AppModelEntitySitesVislanguage) {
                'id' => (int) 4410,
                'site_id' => (int) 23098,
                'language_id' => (int) 9,
                ...,
                '[repository]' => 'SitesVislanguages'
            },
            ...,
            '[repository]' => 'Vislanguages'
        }
    ],
    ...,
    '[repository]' => 'Sites'
}

和我对应的ctp文件是:

<?= $this->Form->control('vislanguages._ids', ['options' => $languages, 'label' => __('Spoken languages:'), 'multiple' => true]); ?>

语言在输入中正确预选。如果我没有任何更改提交,则修补的实体是:

object(app model entity site({

'id' => (int) 23098,
...,
'vislanguages' => [
    (int) 0 => object(AppModelEntityLanguage) {
        'id' => (int) 1,
        ...,
        '[repository]' => 'Vislanguages'
    },
    (int) 1 => object(AppModelEntityLanguage) {
        'id' => (int) 9,
        ...,
        '[repository]' => 'Vislanguages'
    }
],
'[repository]' => 'Sites'

}

这似乎是正确的,但是当我保存时,我会收到以下错误:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'vislanguage_id' in 'where clause' 

查询是:

(SELECT SitesVislanguages.id AS `SitesVislanguages__id`, SitesVislanguages.site_id AS `SitesVislanguages__site_id`, SitesVislanguages.language_id AS `SitesVislanguages__language_id` FROM sites_vislanguages SitesVislanguages WHERE (site_id = :c0 AND vislanguage_id = :c1))
UNION (SELECT SitesVislanguages.id AS `SitesVislanguages__id`, SitesVislanguages.site_id AS `SitesVislanguages__site_id`, SitesVislanguages.language_id AS `SitesVislanguages__language_id` FROM sites_vislanguages SitesVislanguages WHERE (site_id = :c2 AND vislanguage_id = :c3))

为什么我们在WHERE子句中看到vislanguage_id,而它正确考虑language_id而不是在SELECT子句中?

同时,我在这里不太了解UNION

要使它起作用,我必须指定targetForeignKey

class SitesTable extends Table {
public function initialize(array $config) {
    parent::initialize($config);
    $this->belongsToMany('Reclanguages', [
        'targetForeignKey' => 'language_id,
        'joinTable' => 'sites_reclanguages',
        'className' => 'Languages',
        'propertyName' => 'reclanguages'
    ]);
    $this->belongsToMany('Vislanguages', [
        'targetForeignKey' => 'language_id,
        'joinTable' => 'sites_vislanguages',
        'className' => 'Languages',
        'propertyName' => 'vislanguages'
    ]);
}

最新更新