• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Doctrine 2 - arraycollection speichern

fakerer

New member
Hi,
ich versuche eine Arraycollection mit Doctrine2 zu speichern.

dazu habe ich einfach mal eine user und eine post entity erstellt.
mit einer onetomany beziehung. Dabei soll die id des users einfach in der post tabelle in der Spalte user_id gespeichert werden.

in der UserEntity
PHP:
    /**
     * @ORM\OneToMany(targetEntity="Test\Entity\Post", mappedBy="user", cascade={"persist"})
     * @ORM\OrderBy({"id" = "DESC"})
     */
    private $posts;

    public function addPosts($posts)
    {
        foreach ($posts as $post) {
            $this->addPost($post);
        }
        return $this;
    }

    public function addPost(Post $post)
    {
        $this->posts->add($post);
        return $this;
    }
in der PostEntity
PHP:
    /**
     * @ORM\ManyToOne(targetEntity="Test\Entity\User", inversedBy="posts")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;
Wenn ich die Daten abfrage werden sie richtig zurückgegeben.
wenn ich Einträge editiert werden die Änderung gespeichert.
Aber wenn ich einen neuen post hinzufügen will wird die user_id in der post tabelle nicht mitgespeichert.
Was mir dabei schon aufgefallen ist, das wenn ich mir den Inhalt von $post in addPost ansehe fehlt die user_id.
Und es wird ein neuer Datensatz ohne der user_id angelegt also viel kann nicht fehlen hoff ich.
Aber mir gehen die Ideen zum probieren aus :(.
 

[-UFO-]Melkor

New member
Ist im Grunde ganz simpel. Bei einer bidirectional association, wie sie hier vorliegt, gibt es eine owning side und eine inverse side. In diesem Fall ist das Post-Entity deine owning side und das User-Entity deine inversed side. Das ist wichtig, da nur die Informationen der owning side persistiert werden.

Deine addPost-Methode macht also im Grunde gar nichts. Das Standard-Vorgehen wäre hier:

PHP:
    public function addPost(Post $post)
    {
        $post->setUser($this);
        $this->posts->add($post);
    }
PHP:
    public function setUser(User $user)
    {
        $this->user = $user;
    }
Ich hoffe, das hilft dir weiter :)
Gibt dazu auch eine ganz gute Erklärung im Manual.
 

fakerer

New member
Hi,
vielen Dank,
es wurde alles gespeichert außer die user_id.
Aber wie auch immer ich dachte ja ich muss meinen Hydrator ändern,
aber das klingt auch gut, hab es auch schon getestet und es klappt wunderbar.

Danke
 

Luka

New member
Hi,

Ich sitzte gerade vor einem ähnlichen Problem, verstehe die Lösung aber nicht ganz. Ich habe ebenfalls eine OneToMany Relationship. Sprich 1 Post kann viele Bilder haben. Es gibt also ein Formular mit Uploadmöglichkeit. Ich habe 2 Entities Advert und Image und wenn ich es richtig verstehe ist die Advert Entity die Inverse Side und Image die Owning Side.

Advert.php

PHP:
/** Advert
 * 
 * @ORM\Table(name="advert")
 * @ORM\Entity(repositoryClass="Advert\Repository\AdvertRepository")
 */
class Advert
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="advert_title", type="string", length=255, nullable=true)
     */
    private $advertTitle; 


    /**
     * @ORM\OneToMany(targetEntity="Image", mappedBy="adverts", cascade={"persist"})
     */
    protected $images;


    public function __construct() 
    { 
        $this->images = new ArrayCollection(); 
    }


     public function setImages($images)
    {
        $this->images = $images;
        return $this;
    }
     

    public function getImages()
    {
        return $this->images;
    }
       

     public function addImages(\Advert\Entity\Image $images = null)
    {
        $images->setAdvert($this);
        $this->images->add($images);
    }


    public function removeImages($images)
    {
        foreach($images as $images){
            $this->images->removeElement($image);
        }
    }
Image.php
PHP:
class Image
{
    /**
     * @var integer
     *
     * @ORM\Column(name="image_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $imageId;

   /**
     * Bidirectional - Many Images are authored by one advert (OWNING SIDE)
     * @ORM\ManyToOne(targetEntity="Advert", inversedBy="images")
     * @ORM\JoinColumn(name="advert_id", referencedColumnName="id")
     */
    protected $adverts;


   public function setAdvert(\Advert\Entity\Advert $advert = null)
    {
        $this->advert = $advert;
    }
    

    public function getAdvert()
    {
        return $this->advert;
    }
In meinem Controller versuche ich nun die Anzeige zu speichern und dann die advertID in die Image Tabelle mit den Image Daten zu speichern. Dafür versuche ich folgendes:

AdvertController.php

PHP:
    # create a new, empty entity
    $advert = new Advert();
    $images = new Image();    

    $form->bind($advert);
        if ($request->isPost()) {
            $form->setData($request->getPost());
                 
            if ($form->isValid()) {
                  # write changes to database tbl advert
                  $this->getEntityManager()->persist($advert);
                  $this->getEntityManager()->flush();

                  $advert->addImages($images); // Sets the advert id
                  
                  $images->setImageNewname($newFilename);
                  $images->setImageType($upload->getMimeType($file)); // get and set MimeType
                  $images->setImageSize($upload->getFileSize($file)); // get and set Filesizse
                  
                  # write changes to database tbl images
                  $this->getEntityManager()->persist($images);
                  $this->getEntityManager()->flush();
Ich meine zu glauben das es vor ein paar Wochen bereits so lief, aber ich muss etwas geändert haben, dass dieser Part nicht mehr geht. Hat jemand einen Tipp wie ich nun die advertID in meine image tabelle bekomme? Geht so etwas automatisch oder muss ich mir die lastInsertId ausgeben lassen und diese dann "manuell" übergeben? Ich stehe echt auf der Leitung...
 
Oben