5 Stimmen

Symfony2 eingebettete Entitäten

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.

1voto

Ephraim Punkte 260

Versuchen Sie es mit

/**
 * @var Doctrine\Common\Collections\ArrayCollection
 *
 * @ORM\OneToMany(targetEntity="Phone", mappedBy="user", cascade={"persist"})
 */
private $phone;

Für Symfony Embed-Form mit OneToMany-Beziehung muss cascade={"persist"} in der Annotation hinzugefügt werden

0voto

Nanocom Punkte 3666

Sie können verhindern, dass die "Doktrin" angezeigt wird \Common\Collections\ArrayCollection @0000000062cf59cf00000000e32fc883" Nachricht, indem Sie $form->get('phone')->setData(''); Für den Rest kann ich Ihnen nicht helfen, ich hätte auch gerne eine Antwort...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X