Php Symfony->;更新时覆盖现有实体
我正在创建一个简单的用户类Php Symfony->;更新时覆盖现有实体,php,symfony,doctrine-orm,symfony4,Php,Symfony,Doctrine Orm,Symfony4,我正在创建一个简单的用户类 -用户->实体 -地址->实体 创建用户时,我在数据库中创建一个地址记录 现在,当用户被编辑并更改其地址时: 如果地址存在,他需要使用该现有地址 如果地址不存在,Symfony需要创建一个新地址并使用新地址 Atm我可以创建用户及其地址,但编辑用户地址时: 将覆盖当前现有地址,而不是创建新地址 也许我错过了一些逻辑或者我做错了 这是我的密码: public function editAction(Request $request,Users $user) {
-用户->实体
-地址->实体 创建用户时,我在数据库中创建一个地址记录 现在,当用户被编辑并更改其地址时:
如果地址存在,他需要使用该现有地址
如果地址不存在,Symfony需要创建一个新地址并使用新地址 Atm我可以创建用户及其地址,但编辑用户地址时:
将覆盖当前现有地址,而不是创建新地址 也许我错过了一些逻辑或者我做错了 这是我的密码:
public function editAction(Request $request,Users $user)
{
$form = $this->createForm(UserForm::class, $user);
if ($request->getMethod() == 'POST') {
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$form = $form->getData();
$this->tryEditAction($user, $form);
return $this->redirectToRoute('admin_userslist');
}
}
$label = "Gebruiker aanpassen";
return $this->render('@ProjectUser/backend/edit.html.twig', array(
'form' => $form->createView(),
'user' => $user,
'label' => $label,
));
}
下面是TryEditAction:
public function tryEditAction($user, $form)
{
$formAddress = $form->getAddress();
$formAddressStreet = $formAddress->getStreet();
$formAddressStreetNr = $formAddress->getStreetNr();
$formAddressStreetBus = $formAddress->getStreetBus();
$entityManager = $this->getDoctrine()->getManager();
//***
// Getting the entitymanager to get all addresses stored in our db
// Check if this address exist, so we change or edit the address accordingly to the user
//**
$address = $entityManager->getRepository('ProjectLocationBundle:Address')
->findOneBy(
array(
'street' => $formAddressStreet,
'street_nr' => $formAddressStreetNr,
'street_bus' => $formAddressStreetBus
)
);
if($address):
$foundAddress = $address;
$user->setAddress($foundAddress);
$foundAddress->setUser($user);
$entityManager->persist($foundAddress);
else:
$newAddress = new Address();
$newAddress = $formAddress;
$entityManager->persist($newAddress);
$entityManager->flush($newAddress);
$user->setAddress($newAddress);
endif;
// dump($user); die;
$userName = $user->getUsername();
$slug = $this->slugify($userName);
$user->setSlug($slug);
$entityManager->persist($user);
$entityManager->flush();
return $user;
}
1.在控制器中使用tryEdit逻辑是个坏主意。更好的it场所—实体存储库。2.在本例中,您需要使用一对多关系来管理地址数组集合。所有这些有用的东西都可以在条令手册中找到代码>-您是否检查了
$formAddress
中的内容?有什么id
吗?;)明白吗?)所以,试着一个接一个地设置所有属性,除了id
property,如$newAddress->setStreet()=$formAddress->getStreet()代码>,但这里还有一种更好的方法,可以在AddressRepository或Entity.Thnx中添加新方法。。我将代码替换到存储库中。我还检查了地址->$formaddress。。如果地址存在,我就使用这个地址。。否则我会创建一个新的,持久化并刷新它。。当它刷新时,我将它添加到用户中,它现在正在工作,很高兴能提供帮助。