Однако, когда я пытаюсь сохранить это в базе данных, я получаю ошибку с ограничением ограничения, при этом идентификатор имени ссылочной колонки является нулевым.Symfony2 - ReferencedColumnName id is null
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'client_id' cannot be null
Я считаю, что объекты могут быть сконфигурированы правильно и связанных с ними должным образом, есть что-то мне нужно, чтобы добавить к моей форме, что я не хватает?
Клиент
/**
* @ORM\OneToMany(targetEntity="ClientPhone", mappedBy="clients", cascade={"persist"})
*/
protected $clientphones;
Clientphone
/**
* @ORM\ManyToOne(targetEntity="Client", inversedBy="clientphones")
* @ORM\JoinColumn(name="client_id", referencedColumnName="id", nullable=false)
*/
protected $clients;
форма ClientType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('firstName', 'text', array(
'label' => 'First Name'
))
->add('lastName', 'text', array(
'label' => 'Last Name'
))
->add('email', 'text', array(
'label' => 'E-mail Address'
))
->add('clientphones', 'collection', array(
'type' => new ClientPhoneType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
));
}
форма ClientPhoneType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('home', 'text');
$builder->add('office', 'text');
$builder->add('mobile', 'text');
}
ClientController
$client = new Client();
$phone = new ClientPhone();
// $phone->home = '2134959249';
// $phone->office = '2134959249';
// $phone->mobile = '2134959249';
$client->getClientPhones()->add($phone);
$form = $this->createForm(new ClientType(), $client, array(
'action' => $this->generateUrl('client'),
'method' => 'POST',
));
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($client);
$em->flush();
$session = $request->getSession();
$session->getFlashBag()->add('message', 'Client successfully saved to database');
return $this->redirect($this->generateUrl('client'));
}
Это документально проблема - Doctrine2 только сохраняется новая ассоциация, если он установлен на ** владеющий * * сторона ассоциации. В этом случае '$ clientphone' является стороной-владельцем, и всякий раз, когда вы добавляете' $ clientphone' в '$ client', вам также нужно добавить' $ client' к '$ clientphone'. Обратное не должно быть необходимым. –