#doctrine-orm #symfony #persist
#doctrine-orm #symfony #сохраняется
Вопрос:
Все мои настройки Doctrine2 выполняются в файлах YAML. У меня есть класс сущности с именем LoanAppMenuProgress, в котором я пытаюсь выполнить функцию prePersist. Этот объект LoanAppMenuProgress имеет единственную связь с другим классом с именем LoanApp . В таблице LoanAppMenuProgress есть связь с внешним ключом, связанная с таблицей LoanApp в БД.
У меня есть эта конфигурация для моего класса LoanAppMenuProgress в LoanApp.LoanAppMenuProgress.orm.yml:
LoanEvLoanAppBundleEntityLoanAppLoanAppMenuProgress:
type: entity
repositoryClass: LoanEvLoanAppBundleRepositoryLoanAppLoanAppMenuProgress
table: loan_app_menu_progress
id:
id:
type: integer
generator: { strategy: auto }
### This is the OWNING side of the relationship
oneToOne:
loan_app:
targetEntity: LoanApp
inversedBy: loanapp_menu
joinColumn:
name: loan_id
referencedColumnName: id
fields:
loan_id:
type: integer
menu_id2:
type: integer
menu_id3:
type: integer
menu_id4:
type: integer
lifecycleCallbacks:
prePersist: [ updateMainMenuStatus ]
Это мой файл LoanApp.LoanApp.orm.yml:
LoanEvLoanAppBundleEntityLoanAppLoanApp:
type: entity
repositoryClass: LoanEvLoanAppBundleRepositoryLoanAppLoanAppRepository
table: loan_app
id:
id:
type: integer
generator: { strategy: auto }
## This is the INVERSE side of the relationship.
oneToOne:
loanapp_menu:
targetEntity: LoanAppMenuProgress
mappedBy: loan_app
fields:
bank_id:
type: integer
# etc.
В моем классе объектов LoanAppMenuProgress у меня есть следующий код:
namespace LoanEvLoanAppBundleEntityLoanApp;
use DoctrineORMMapping as ORM;
use DoctrineCommonUtilDebug;
/**
* LoanEvLoanAppBundleEntityLoanAppLoanAppMenuProgress
*/
class LoanAppMenuProgress
{
private $id;
private $loan_id;
/**
* @var LoanEvLoanAppBundleEntityLoanAppLoanApp
*/
private $loan_app;
private $menu_id2 = 0;
private $menu_id3 = 0;
private $menu_id4 = 0;
// ...
public function updateMainMenuStatus()
{
echo("Inside prePersist's updateMainMenuStatus function. ");
}
}
Следующий код вызывается из моего класса LoanAppController:
// ...
//Save the menuStatus changes.
echo("About to persist. ");
$em->persist($menuStatus[0]);
echo("Done persisting.");
$em->flush();
// ...
Когда я выполняю код в LoanAppController, на мой экран выводится следующее:
«Собирается сохраниться. Выполнено сохранение «.
Мне не хватает этого бита в середине, где вывод должен гласить:
«Собирается сохраниться. Внутри функции updateMainMenuStatus prePersist. Выполнено сохранение «.
Изменения записываются в базу данных, и вся функциональность системы работает должным образом, за исключением prePersist() . Я довольно долго боролся с настройками yml, поэтому мое первоначальное предположение заключается в том, что моя настройка YAML неверна.
В документации (насколько я мог понять) упоминается, что я должен добавить элементы lifecycleCallbacks: и prePersist: в файл yml, а затем убедиться, что у меня есть общедоступная функция в сохраняющемся объекте. Очевидно, я что-то упускаю.
У кого-нибудь есть какие-либо идеи?
Спасибо.
Ответ №1:
prePersist вызывается только при выполнении инструкции INSERT type. Это событие никогда не сработает при действии ОБНОВЛЕНИЯ. Чтобы выполнить какое-либо действие при обновлении объекта, используйте preUpdate . Обратите внимание, что preUpdate имеет гораздо больше ограничений на то, что может быть выполнено с рассматриваемой сущностью.
Вышка