У меня возникла проблема с попыткой исправить сущность. Моя $this->request->data
выглядит следующим образом:Сохранение связанных данных с помощью cakephp 3
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"
]
Но после того, как я пропатчить сущность ($unidade = $this->Unidades->patchEntity($unidade, $this->request->data);
), я получаю странное поведение: Массив «Системас» выглядит нормально, но содержимое «localidades» массив не исправлен , Ниже дамп моего $ 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"
}
Так мое «Системас» в настоящее время пропатчны nicelly, но не мой «localidades». Оба они выглядят одинаково в моих табличных классах. Вот часть моего файла 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'
]);
Они в основном тот же тип объединения (имеет и принадлежит многим, как с посредническими таблицами, содержащий идентификатор и оба внешних ключей). Так почему они ведут себя по-другому? Как я могу отладить это?
Почти забыл: Это часть моей модели:
Заранее спасибо =]
редактировал: Там следует мой 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
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;
}
localidades запрос данные не передаются проверки –
Hi @NNem, спасибо за помощь мне! Да, это действительно странно. В обоих случаях я передаю только «id» ('sistemas' и' localidades'). Первая ассоциация правильно исправлена, полный объект извлекается в БД, нет ошибок. 'Localidades' ведут себя по-другому: он создает новый объект (« новый »: истинный), без данных и с ошибками проверки. –