Ich habe eine "Aufgaben" -Tabelle, die auf eine "Estados" -Tabelle mit einem Fremdschlüssel aus Spalte Tasks.taskestado zu Estados.estado verweist.symfony3: Formular für Entität erstellen, die über eine Spalte mit vielen zu einer Beziehung verfügt
Hier ist die relevante XML-Mapping für Aufgaben:
<entity name="AppBundle\Entity\Tasks" table="TASKS" repository-class="AppBundle\Repository\TasksRepository">
<id name="taskid" type="bigint" column="TaskID">
<generator strategy="IDENTITY"/>
</id>
...
<many-to-one field="taskestado" target-entity="Estados" fetch="LAZY">
<join-columns>
<join-column name="TaskEstado" referenced-column-name="Estado"/>
</join-columns>
</many-to-one>
...
Und für Estados:
<entity name="AppBundle\Entity\Estados" table="ESTADOS">
<id name="estado" type="string" column="Estado" length="15">
<generator strategy="IDENTITY"/>
</id>
<field name="estadodescricao" type="string" column="EstadoDescricao" length="50" nullable="true">
<options>
<option name="fixed"/>
</options>
</field>
...
dies gegeben, ich versuche, eine Aktion (novaAction()) Aufgaben zu schaffen zu machen. Hier ist der Controller-Code:
public function novaAction(Request $request)
{
$task = new Tasks();
$em = $this->getDoctrine()->getManager();
dump($task);
#$task->setTaskEstado(new Estados());
$form = $this->createForm(TasksType::class, $task);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
// Criar a tarefa na BD
$em->persist($form->getData());
$em->flush();
$this->addFlash('notice', 'app.nova_tarefa.mensagem_sucesso');
return $this->redirectToRoute('nova_tarefa');
}
$this->addFlash('error', 'app.nova_tarefa.mensagem_erro');
}
und der relevante TasksType Code:
class TasksType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('taskid', HiddenType::class)
...
#->add('taskestado')
->add('taskestado', EntityType::class, [ 'class' => 'AppBundle:Estados' ])
...
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Tasks',
#'empty_data' => function (\Symfony\Component\Form\FormInterface $form) {
# #return new Tasks($form->get('tasks')->getData());
# return new Tasks();
#},
));
}
}
Die 'empty_data' Option war ein Versuch, die Form ohne Umweg eine Instanz von Aufgaben, um es zu schaffen. Auch habe ich das gleiche Ergebnis, wenn ich Taskedado mit dem kommentierten Code, ich. e., ohne Argumente.
Und hier ist die entsprechende Einheit Aufgaben:
namespace AppBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Tasks
*/
class Tasks
{
/**
* @var integer
*/
protected $taskid;
/**
* @var \AppBundle\Entity\Estados
*/
protected $taskestado;
...
/**
* Get taskid
*
* @return integer
*/
public function getTaskid()
{
return $this->taskid;
}
/**
* Set taskestado
*
* @param \AppBundle\Entity\Estados $taskestado
*
* @return Tasks
*/
public function setTaskestado(\AppBundle\Entity\Estados $taskestado = null)
{
$this->taskestado = $taskestado;
return $this;
}
/**
* Get taskestado
*
* @return \AppBundle\Entity\Estados
*/
public function getTaskestado()
{
return $this->taskestado;
}
...
}
Wenn ich die Seite zu öffnen, bekomme ich folgende Fehlermeldung:
Entities passed to the choice field must be managed. Maybe persist them in the entity manager?
Ich würde auch die CRUD erzeugt (bin/console doctrine:generate:crud --filter=Tasks
), so dass Ich könnte überprüfen, wie es gemacht wird, aber der Code ist ähnlich, ebenso wie die Ergebnisse (nachdem einige Probleme im TasksType für einige Datetime-Spalten behoben wurden).
Was mache ich falsch?
Haben Sie Code in Ihrer 'Task' Entität, der den' Taskestado' automatisch initialisiert? – xabbuh
Bevor ich den Code von mblaettermann hinzufüge, hatte ich sogar die Funktion __construct() nicht. –
Können Sie trotzdem den Code dieser Entitätsklasse anzeigen? – xabbuh