Я создаю простой пользовательский класс
- Пользователь -> entity
- Адрес -> сущность
Когда пользователь был создан, я создаю адресную запись в своей базе данных.
Теперь, когда пользователь отредактировал и изменил свой адрес:
Если адрес существует, ему нужно взять этот существующий адрес
если адрес не существует, Symfony необходимо создать новый и использовать новый адрес.
В банкомате я могу создавать пользователей и их адрес,
, но когда я редактирую адрес пользователя:
Текущий существующий адрес будет перезаписан вместо создания нового.
Может я упустил какую-то логику или делаю это неправильно.
вот мой код:
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;
}
Также по поводу этого $newAddress = $formAddress; - вы проверяли, что внутри $formAddress? Какой там id? ;) Понимаете?) Итак, попробуйте установить все свойства одно за другим, кроме свойства id, как $newAddress->setStreet() = $formAddress->getStreet();, но это также лучший способ добавить новый метод в ваш AddressRepository или в Entity.
Спасибо ребята .. Я заменил свой код в репозиторий. Я также проверил адрес -> $ formaddress .. Если адрес существует, я использую этот адрес .. В противном случае я создаю новый, сохраняю и сбрасываю его .. Когда он сбрасывается, я добавляю его пользователю. Теперь он работает
Рад быть полезным.






1. Наличие логики tryEdit в контроллере - плохая идея. Лучшее место для этого - хранилище сущностей. 2. В вашем случае вам необходимо использовать отношение «один ко многим» для управления коллекцией массивов адресов. Все это полезное вы найдете в руководстве по доктрине.