CakePHP hasAndBelogsToMany использует save() вместо.сохранить все()
-
02-07-2019 - |
Вопрос
Я использую очень встроенную базу данных с приложением CakePHP, и до сих пор мои представления и контроллеры с несколькими моделями работают нормально.У меня есть единственная таблица (Entity
), у которых есть это id
в нескольких других таблицах в качестве внешнего ключа entity_id
Некоторые таблицы представляют собой отношения один к одному (например, Company
это один Entity
), а некоторые — один ко многим (Entity
может иметь несколько Addresses
) и так далее.
Я не буду/не могу изменить модель базы данных, так это структура.
я использовал saveAll()
чтобы сохранить данные в этих таблицах с входными именами, например:
Entity.type='x' (hidden inside the view)
Company.name
Address.0.street
Address.0.city
Address.1.street
Address.1.city
... and so on ...
и мое спасение - это выполнение всей тяжелой работы, BEGIN TRANSACTION
, все INSERT
и финал COMMIT
...
Но теперь я создал EntityCategory
это отношение n к n и создало полную HABTM
отношение внутри модели.
Это работает, когда я save()
это но только HABTM
отношение, и это сохраняет все, когда я использую saveAll()
(как и прежде), за исключением HABTM
связь.
Я что-то пропустил ?Как мне заставить это работать правильно?Сегодня я использую следующий код:
if (!empty($this->data)) {
$this->Entity->saveAll($this->data);
$this->Entity->save($this->data);
}
А saveAll()
сохраняет все данные в нескольких таблицах, сохраняет идентификатор в Entity->id
и save()
сохраняет HABTM
отношений, но я не уверен, правильно ли это или могут ли возникнуть проблемы, если я изменю какую-то структуру/модель.
Это лучший способ его использовать?Есть ли правильный способ сохранить эти отношения внутри CakePHP?Что ваш опыт/знания могут мне сказать?
Решение
Это исправляется, если вы скачаете каждую ночь.
Будьте осторожны, может сломаться что-то еще.
Другие советы
Проблема с ассоциациями saveAll() и HABTM — это известный CakePHP. проблема, и не была решена начиная с версии 1.2 RC2.
Что касается лучших практик сохранения связанных данных модели, согласно CakePHP. Кулинарная книга:
«При работе со связанными моделями важно понимать, что сохранение данных модели всегда должно выполняться соответствующей моделью CakePHP.Если вы сохраняете новую публикацию и связанные с ней комментарии, во время операции сохранения вам следует использовать обе модели публикации и комментария».
Однако использование saveAll() и save() должно работать, и ИМХО является более гибким/универсальным решением.