Ich habe die Schwierigkeit, ein Formular auf eine ganz bestimmte Art und Weise auszugeben und versuche dies zu verdeutlichen. Ich habe 2 Entities (Building, Floor). Es gibt also Gebäude, die mit Stockwerken verknüpft sind. Der Benutzer kann also festlegen, dass Gebäude A zum Beispiel Stockwerk A und Stockwerk B zugeordnet ist. Zur Veranschaulichung kurz die Entities und eine vereinfachte Datenbank-Struktur:
Die Entity "Association" habe ich, weil innerhalb der Tabelle weitere Felder enthalten sind, die Informationen aufnehmen. Zur Verdeutlichung noch eine beispielhafte Datenbank:
Tabelle "floors"
Tabelle "buildings"
Tabelle "associations"
Jetzt zur Problematik: Ich versuche anhand der Struktur und Zuhilfenahme von Standard Formklassen in Symfony ein Formular zu erzeugen, dass alle Buildings anzeigt. Zu jedem Building soll dann in einem Select-Menü einer der Floors ausgewählt werden können. Ich stehe gerade scheinbar auf dem Schlauch und bekomme das nicht wie gewollt hin.
Verdeutlichung, was ich ausgeben möchte:
Building 1
Menü mit Auswahlwerten Floor 1, Floor 2
Building 2
Menü mit Auswahlwerten Floor 1, Floor 2, Floor 3
Abgesendetes Formular (Daten) würde dann so aussehen:
Ich habe hierbei mit verschiedenen Formklassen herumprobiert, finde aber nicht die richtige Kombination aus den Typen die ich nutzen muss. Habe bereits folgenden Ansatz gehabt:
Formular, dass als Feldtyp 'Collection' beinhaltet und eine 'Collection' an Buildings ausgibt. Innerhalb jedes Building fehlt mir aber die Möglichkeit, dann noch einmal ein Select-Menü zu erzeugen.
Ich hoffe das war verständlich genug und jemand kann mir auf die Sprünge / mit einem Beispiel aushelfen.
PHP-Code:
<?php
namespace AppBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* Building
*
* @ORM\Table(name="buildings")
*/
class Building
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
/**
* One Building has Many Floor
*
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="Association", mappedBy="building", cascade={"persist", "remove"}, orphanRemoval=TRUE)
*/
protected $associations;
[...]
}
PHP-Code:
<?php
namespace AppBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* Floor
*
* @ORM\Table(name="floors")
*/
class Floor
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=5, unique=true)
*/
private $title;
/**
* One Floor has Many Building
*
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="Association", mappedBy="floor", cascade={"persist", "remove"}, orphanRemoval=TRUE)
*/
protected $associations;
}
PHP-Code:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Association
*
* @ORM\Table(name="associations")
*/
class Association
{
/**
* @var Floor
*
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Floor", inversedBy="associations")
* @ORM\JoinColumn(name="floor_id", referencedColumnName="id", nullable=FALSE)
*/
private $floor;
/**
* @var Building
*
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Building", inversedBy="associations")
* @ORM\JoinColumn(name="building_id", referencedColumnName="id", nullable=FALSE)
*/
private $building;
[...]
}
Tabelle "floors"
id | title |
1 | Floor 1 |
2 | Floor 2 |
3 | Floor 3 |
4 | Floor 4 |
Tabelle "buildings"
id | title |
1 | Building 1 |
2 | Building 2 |
3 | Building 3 |
4 | Building 4 |
id | building_id | floor_id |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 1 |
4 | 2 | 2 |
5 | 2 | 3 |
Verdeutlichung, was ich ausgeben möchte:
Building 1
Menü mit Auswahlwerten Floor 1, Floor 2
Building 2
Menü mit Auswahlwerten Floor 1, Floor 2, Floor 3
Abgesendetes Formular (Daten) würde dann so aussehen:
PHP-Code:
// Struktur [building_id][floor_id]
// Wenn für Building 1 Floor 1 ausgewählt wurde und
// wenn für Building 2 Floor 3 aus dem Select-Menü ausgewählt wurde
[1][2]
[2][3]
Formular, dass als Feldtyp 'Collection' beinhaltet und eine 'Collection' an Buildings ausgibt. Innerhalb jedes Building fehlt mir aber die Möglichkeit, dann noch einmal ein Select-Menü zu erzeugen.
Ich hoffe das war verständlich genug und jemand kann mir auf die Sprünge / mit einem Beispiel aushelfen.