Я пытаюсь сохранить связанные данные, но, несмотря на то, что они, кажется, установлены правильно, они не фиксируются в базе данных. Я должен явно использовать связанную таблицу для сохранения данных. использование ключевого слова «связанный» неэффективно.
мой контроллер действия:
public function test_associated_save()
{
$usersTable = TableRegistry::get('Users');
$test_user = $usersTable->get(21, ['contain' => ['Names']]);
$test_user['names'][0]['middle'] = 'test name';
$usersTable->save($test_user);
$usersTable->save($test_user, ['associated' => ['Names']]);
debug($test_user);
$test_user = $usersTable->get(21, ['contain' => ['Names']]);
debug($test_user);
$test_user['names'][0]['middle'] = 'test name';
$namesTable = TableRegistry::get('Names');
$namesTable->save($test_user['names'][0]);
$test_user = $usersTable->get(21, ['contain' => ['Names']]);
debug($test_user);
}
отладочный вывод для двух $ test_user
первая отладка
object(App\Model\Entity\User) {
'id' => (int) 21,
...
'names' => [
(int) 0 => object(App\Model\Entity\Name) {
'id' => (int) 20,
'user_id' => (int) 21,
'middle' => 'test name',
...
'[accessible]' => [
...
'middle' => true,
...
],
'[dirty]' => [
'middle' => true
],
'[original]' => [
'middle' => ''
],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Names'
},
...
второй отладка
object(App\Model\Entity\User) {
'id' => (int) 21,
...
'names' => [
(int) 0 => object(App\Model\Entity\Name) {
'id' => (int) 20,
'user_id' => (int) 21,
'middle' => '',
...
'[accessible]' => [
...
'middle' => true,
...
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Names'
},
...
третий отладчик
object(App\Model\Entity\User) {
'id' => (int) 21,
...
'names' => [
(int) 0 => object(App\Model\Entity\Name) {
'id' => (int) 20,
'user_id' => (int) 21,
'middle' => 'test name',
...
'[accessible]' => [
...
'middle' => true,
...
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Names'
},
...
Моя таблица пользователей
class UsersTable extends Table
{
public function initialize(array $config)
{
$this->table('users');
$this->displayField('username');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->hasMany('Names', [
'foreignKey' => 'user_id'
]);
...
}
...
}
Таблица моих имен
Класс NamesTable расширяет таблицу
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
$this->table('names');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
}
мои таблицы MySQL
CREATE TABLE IF NOT EXISTS `users` (
`id` int(10) unsigned NOT NULL,
`username` varchar(50) NOT NULL,
...
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `names` (
`id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`middle` varchar(255) NOT NULL,
...
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8;
не используйте доступ к массиву для изменения значений объекта.
ты можешь использовать patchEntity вместо этого, после создания измененного массива данных.
$test_data = [
'names' => [
[
'id' => $test_user['names'][0]['id'],
'middle' => 'test name 5'
]
]
];
$usersTable->patchEntity($test_user, $test_data);
Других решений пока нет …