简体   繁体   English

用cakephp 3保存关联数据

[英]Save associated data with cakephp 3

I'm facing a problem trying patch an entity. 我在尝试修补实体时遇到问题。 My $this->request->data looks like this: 我的$this->request->data看起来像这样:

array:15 [▼
  "tipo_unidade_id" => "1"
  "sistemas" => array:2 [▼
    0 => array:1 [▶]
    1 => array:1 [▼
      "id" => "1"
    ]
  ]
  "localidades" => array:1 [▼
    0 => array:1 [▼
      "id" => "2"
    ]
  ]
  "status" => "1"
]

But after I patch the entity ( $unidade = $this->Unidades->patchEntity($unidade, $this->request->data); ), I get an odd behavior: The "sistemas" array looks OK, but the contents of the "localidades" array isn't patched. 但是在我修补了实体( $unidade = $this->Unidades->patchEntity($unidade, $this->request->data); )之后,我得到了一个奇怪的行为:“ sistemas”数组看起来还可以,但是未修补“ localidades”数组的内容。 Below is a dump of my $unidade: 以下是我的$ unidade的转储:

Unidade {#115 ▼
  +"tipo_unidade_id": 1
  +"sistemas": array:2 [▼
    0 => Sistema {#193 ▼
      +"id": 5
      +"status": true
      +"nome": "novoSissstema"
      +"created": Time {#191 ▶}
      +"modified": Time {#192 ▶}
      +"[new]": false
      +"[accessible]": array:1 [▶]
      +"[dirty]": []
      +"[original]": []
      +"[virtual]": []
      +"[errors]": []
      +"[repository]": "Sistemas"
    }
    1 => Sistema {#190 ▶}
  ]
  +"localidades": array:1 [▼
    0 => Localidade {#173 ▼
      +"[new]": true
      +"[accessible]": array:1 [▶]
      +"[dirty]": []
      +"[original]": []
      +"[virtual]": []
      +"[errors]": array:3 [▼
        "id" => array:1 [▼
          "unique" => "The provided value is invalid"
        ]
        "status" => array:1 [▼
          "_required" => "This field is required"
        ]
        "nome" => array:1 [▼
          "_required" => "This field is required"
        ]
      ]
      +"[repository]": "Localidades"
    }
  ]
  +"status": true
  +"[new]": true
  +"[accessible]": array:1 [▶]
  +"[dirty]": array:10 [▶]
  +"[original]": []
  +"[virtual]": []
  +"[errors]": []
  +"[repository]": "Unidades"
}

So my "sistemas" are being patched nicelly, but not my "localidades". 因此,我的“ sistemas”得到了很好的修补,但我的“ localidades”却没有得到修复。 They both look similar in my table classes. 它们在我的表类中看起来都相似。 Here is a piece of my UnidadesTable.php file: 这是我的UnidadesTable.php文件的一部分:

$this->belongsToMany('Localidades', [
            'foreignKey' => 'unidade_id',
            'targetForeignKey' => 'localidade_id',
            'joinTable' => 'localidades_unidades'
        ]);
        $this->belongsToMany('Sistemas', [
            'foreignKey' => 'unidade_id',
            'targetForeignKey' => 'sistema_id',
            'joinTable' => 'sistemas_unidades'
        ]);

They're basically the same type of association (has and belongs to many, both with intermediary tables, containing an id and both foreign keys). 它们基本上是同一类型的关联(具有并且属于许多关联,两者都具有包含id和两个外键的中间表)。 So why are they behaving differently? 那么他们为什么表现不同? How can I debug this? 我该如何调试?

Almost forgot: This is part of my model: 差点忘了:这是我模型的一部分: 我的模特

Thanks in advance =] 在此先感谢=]

edited: There follows my SistemasTable and LocalidadesTable files: 编辑:以下是我的SistemasTable和LocalidadesTable文件:

class SistemasTable extends Table
{
public function initialize(array $config)
    {
    parent::initialize($config);

    $this->table('sistemas');
    $this->displayField('nome');
    $this->primaryKey('id');

    $this->addBehavior('Timestamp');

    $this->hasMany('Mapas', [
        'foreignKey' => 'sistema_id'
    ]);
    $this->belongsToMany('Unidades', [
        'foreignKey' => 'sistema_id',
        'targetForeignKey' => 'unidade_id',
        'joinTable' => 'sistemas_unidades'
    ]);
}
public function validationDefault(Validator $validator)
{
    $validator
        ->add('id', 'valid', ['rule' => 'numeric'])
        ->allowEmpty('id', 'create')
        ->add('id', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']);

    $validator
        ->add('status', 'valid', ['rule' => 'boolean'])
        ->requirePresence('status', 'create')
        ->notEmpty('status');

    $validator
        ->requirePresence('nome', 'create')
        ->notEmpty('nome');

    return $validator;
}
public function buildRules(RulesChecker $rules)
{
    $rules->add($rules->isUnique(['id']));
    return $rules;
}

LocalidadesTable.php LocalidadesTable.php

class LocalidadesTable extends Table
{
public function initialize(array $config)
{
    parent::initialize($config);

    $this->table('localidades');
    $this->displayField('nome');
    $this->primaryKey(['id']);

    $this->addBehavior('Timestamp');

    $this->belongsTo('Municipios', [
        'foreignKey' => 'municipio_id',
        'joinType' => 'INNER'
    ]);
    //edited at 20160203 - 07:03 GMT-3
    $this->belongsToMany('Unidades', [
        'foreignKey' => 'localidade_id',
        'targetForeignKey' => 'unidade_id',
        'joinTable' => 'localidades_unidades'
    ]);
    //
}
public function validationDefault(Validator $validator)
{
    $validator
        ->add('id', 'valid', ['rule' => 'numeric'])
        ->allowEmpty('id', 'create')
        ->add('id', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']);

    $validator
        ->add('status', 'valid', ['rule' => 'numeric'])
        ->requirePresence('status', 'create')
        ->notEmpty('status');

    $validator
        ->requirePresence('nome', 'create')
        ->notEmpty('nome');

    return $validator;
}
public function buildRules(RulesChecker $rules)
{
    $rules->add($rules->isUnique(['id']));
    $rules->add($rules->existsIn(['municipio_id'], 'Municipios'));
    return $rules;
}

You do not have the belongsToMany('Unidades') in LocalidadesTable 你没有belongsToMany('Unidades')LocalidadesTable

$this->belongsToMany('Unidades', [
    'foreignKey' => 'localidade_id',
    'targetForeignKey' => 'unidade_id',
    'joinTable' => 'localidades_unidades'
]);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM