Ich habe User und Phone Entitäten mit einer OneToMany Beziehung zwischen ihnen.
Meine Benutzereinheit:
namespace Project\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Project\UserBundle\Entity\User
*
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User
{
/* ..... */
/**
* @var Doctrine\Common\Collections\ArrayCollection
*
* @ORM\OneToMany(targetEntity="Phone", mappedBy="user")
*/
private $phone;
public function __construct()
{
$this->phone = new ArrayCollection();
}
/**
* Add phone
*
* @param Project\UserBundle\Entity\Phone $phone
*/
public function addPhone(\Project\UserBundle\Entity\Phone $phone)
{
$this->phone[] = $phone;
}
/**
* Get phone
*
* @return Doctrine\Common\Collections\Collection
*/
public function getPhone()
{
return $this->phone;
}
/* ..... */
}
Und meine Telefoneinheit:
namespace Project\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Project\UserBundle\Entity\Phone
*
* @ORM\Table(name="user_phone")
* @ORM\Entity
*/
class Phone
{
/* ..... */
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="phone")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
/**
* @var string $number
*
* @ORM\Column(name="number", type="string", length=128)
*/
private $number;
/**
* Set user
*
* @param Project\UserBundle\Entity\User $user
*/
public function setUser(\Project\UserBundle\Entity\User $user)
{
$this->user = $user;
}
/**
* Get user
*
* @return Project\UserBundle\Entity\User
*/
public function getUser()
{
return $this->user;
}
/* ..... */
}
Ich habe einen Teil des Codes gelöscht, um ihn etwas zu verkürzen. Ich habe ein Id-Feld und zusätzliche andere Felder, die sich auf die Entitäten beziehen.
In meinem Controller mache ich das:
public function showFormAction($entity)
{
/* ..... */
$user = new User();
$phone = new Phone();
$user->addPhone($phone);
$form = $this->createForm(new UserRegister(), $user);
/* ..... */
}
In meiner Schulklasse:
class UserRegister extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('email', 'text')
->add('password', 'repeated', array(
'type' => 'password',
'invalid_message' => 'The password fields must match.',
'options' => array('label' => 'Password'),
'error_bubbling' => false)
)
->add('first_name', 'text')
->add('last_name', 'text')
->add('phone', 'text' );
}
public function getName()
{
return 'register';
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Project\UserBundle\Entity\User',
);
}
}
Und in meiner Zweigvorlage:
<div>
{{ form_errors(form.phone) }}
{{ form_label(form.phone, null, { 'attr': {'class': 'span-3'} } ) }}
{{ form_widget(form.phone, { 'attr': {'class': 'text'} } ) }}
</div>
Was ich versuche, im Grunde zu tun ist, damit ein Benutzer mehrere Telefonnummern haben, daher mit einer OneToMany-Beziehung zwischen Benutzer und Telefon. In meinem Formular möchte ich das Feld "number" der Entität "Phone" anzeigen und dann einen einzelnen Telefondatensatz zu dem jeweiligen Benutzer hinzufügen.
Derzeit wird das Formular mit dem obigen Code zwar gerendert, aber nicht angezeigt:
"Doktrin \Common\Collections\ArrayCollection @0000000062cf59cf00000000e32fc883" im Feld Telefon.
Das Ändern von "phone" in "collection" in der Formularklasse führt zu einem Twig_Runtime_Error "Phone could not be converted to string" 500 internal server error. Ich habe versucht, phone als 'form.phone.number' zu rendern, um das Element number in der Entität Phone zu erhalten, aber es heißt:
"Methode "Nummer" für Objekt "Symfony \Component\Form\FormView "existiert nicht"
Ich habe auch versucht, den Typ "phone" in der Formularklasse in "entity" zu ändern und habe das Array hinzugefügt, um den Entity-Namensraum widerzuspiegeln, aber es würde immer den Fehler "You need to manage your Entity" anzeigen.
Ich bin irgendwie verloren und nicht sicher, wie soll dies getan werden, ich habe irgendwo gelesen, dass ich sowohl Benutzer und Telefon-Objekte separat instanziieren kann, die Änderungen vornehmen und dann persistieren Sie eine nach der anderen. Ich bin nicht sicher, ob das die beste Praxis ist oder nicht, mein Ansatz war es, ein User-Objekt zu erstellen, fügen Sie einen Telefon-Datensatz zu ihm, und dann persist User-Objekt.