turk porno porno escort rokettube
Ergebnis 1 bis 4 von 4

Thema: Doctrine 2 - arraycollection speichern

  1. #1
    Erfahrener Benutzer
    Registriert seit
    21.07.2009
    Beiträge
    102
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard Doctrine 2 - arraycollection speichern

    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-Code:
        /**
         * @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-Code:
        /**
         * @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 .

  2. #2
    Erfahrener Benutzer Avatar von [-UFO-]Melkor
    Registriert seit
    06.01.2009
    Beiträge
    327
    Thanks
    0
    Thanked 34 Times in 31 Posts

    Standard

    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-Code:
        public function addPost(Post $post)
        {
            
    $post->setUser($this);
            
    $this->posts->add($post);
        } 
    PHP-Code:
        public function setUser(User $user)
        {
            
    $this->user $user;
        } 
    Ich hoffe, das hilft dir weiter
    Gibt dazu auch eine ganz gute Erklärung im Manual.
    Blog über PHP und das ZF2

  3. #3
    Erfahrener Benutzer
    Registriert seit
    21.07.2009
    Beiträge
    102
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    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

  4. #4
    Erfahrener Benutzer
    Registriert seit
    21.02.2010
    Beiträge
    249
    Thanks
    8
    Thanked 15 Times in 5 Posts

    Standard

    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-Code:
    /** 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-Code:
    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-Code:
        # 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...

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 20.12.2012, 20:39
  2. Antworten: 1
    Letzter Beitrag: 20.12.2012, 20:34
  3. Session in DB speichern
    Von Bleistift im Forum Auth
    Antworten: 29
    Letzter Beitrag: 11.05.2011, 15:16
  4. Zend_Form_Element_File Werte speichern
    Von ZF_Fan im Forum Formulare
    Antworten: 4
    Letzter Beitrag: 29.12.2009, 12:11
  5. Antworten: 0
    Letzter Beitrag: 21.08.2009, 12:38

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •