2017-04-24 12 views
0

フォームにbelongsToManyアソシエーションを入力しようとしましたが、かなり特殊なアソシエーション記述です。
私のエンティティSiteは2つの異なる用途で言語を使用できるため、2つの結合テーブルを使用します。
だから、スキーマは、以下のCakePHP3.4:belongsToManyアソシエーションの保存中にエラーが発生しました

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' 
    ]); 

} 

クラス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', 
    ]); 
} 

私はaddのための問題を抱えているとeditを拡張フォームは、私はここではの例を取る0。 site製のI find()準備ができている場合、データ構造は次のとおりです。

object(App\Model\Entity\Site) { 

    'id' => (int) 23098, 
    'Vislanguages' => [ 
     (int) 0 => object(App\Model\Entity\Language) { 

      'id' => (int) 1, 
      '_joinData' => object(App\Model\Entity\SitesVislanguage) { 

       'id' => (int) 4409, 
       'site_id' => (int) 23098, 
       'language_id' => (int) 1, 
       ..., 
       '[repository]' => 'SitesVislanguages' 

      }, 
      ..., 
      '[repository]' => 'Vislanguages' 

     }, 
     (int) 1 => object(App\Model\Entity\Language) { 

      'id' => (int) 9, 
      '_joinData' => object(App\Model\Entity\SitesVislanguage) { 

       '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]); ?> 

言語が正しく入力で事前に選択されています。 私はそのままそれを提出した場合は、パッチを適用するエンティティは次のとおりです。

正しいように思わ

オブジェクト(のApp \モデル\エンティティ\サイト){

'id' => (int) 23098, 
..., 
'vislanguages' => [ 
    (int) 0 => object(App\Model\Entity\Language) { 

     'id' => (int) 1, 
     ..., 
     '[repository]' => 'Vislanguages' 

    }, 
    (int) 1 => object(App\Model\Entity\Language) { 

     '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)) 

vislanguage_idWHERE句に表示されるのに対して、SELECT句の代わりにlanguage_idが正しく認識されるのはなぜですか。

同時に、私は実際にUNIONを理解していません。

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' 
    ]); 

} 

答えて

0

はそれが働いてもらうために、私は targetForeignKeyを指定する必要がありました
関連する問題