• 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 und Relation von Entities

Luka

New member
Ich versuche mich gerade in Doctrine einzuarbeiten. Ich habe 2 Entities:
User und Advert (1:n)

Ich habe nun jedoch ein Problem mit der OneToMany Verbindung. Ich moechte alle Adverts angezeigt bekommen, mit dem jeweiligen Usernamen, also eigentlich nichts kompliziertes, aber ich bekomme immer die Meldung "Column not found: 1054 Unknown column 't0.username'

Es muss also ein Fehler in der Verbindung der beiden Tabellen sein, aber ich sehe meinen Denkfehler nicht, habt Ihr einen Rat? Hier mal mein Code:

PHP:
namespace Advert\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

class Advert
{
    /**
     * @var integer
     *
     * @ORM\Column(name="advert_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $advertId;

    /**
     * @var integer
     *
     * @ORM\Column(name="advert_user_id", type="integer", nullable=true)
     */
    private $advertUserId;

 
    /**
     * @ORM\Column(type="string")
     * @ORM\ManyToOne(targetEntity="User", inversedBy="adverts", cascade={"persist"})
     * @ORM\JoinColumn(name="advert_user_id", referencedColumnName="user_id", unique=false, nullable=false)
     */ 
    private $username;
 
    /** 
     * @var string 
     * 
     * @ORM\Column(name="advert_title", type="string", length=255, nullable=true) 
     */ 
    private $advertTitle;


   /**
     * Get username
     *
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }
PHP:
<?php

namespace Advert\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection; 


/**
 * User
 *
 * @ORM\Table(name="user", uniqueConstraints={@ORM\UniqueConstraint(name="username", columns={"username"}), @ORM\UniqueConstraint(name="email", columns={"email"})})
 * @ORM\Entity
 */
class User
{
    /**
     * @var integer
     *
     * @ORM\Column(name="user_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $userId;

    /**
     * @var string
     *
     * @ORM\OneToMany(targetEntity="Advert", mappedBy="user", cascade={"persist"})
     */
    private $username;


    /**
     * Constructor
     */
    public function __construct()
    {
        $this->adverts = new \Doctrine\Common\Collections\ArrayCollection();
    }
Ich hoffe jemand kann helfen. Vielen Dank
 

av3nger

New member
Was mir sofort auffällt, ist der $username in der Advert-Entity. Ursache für die Fehlermeldung ist vor allem das
PHP:
@ORM\Column(type="string")
bei dem $username. Es ist keine Spalte, sondern eine Relation, die du ja ebenfalls mit angegeben hast. Das ist der erste Fehler. Also raus mit der Column-Annotation.

Da du in der User-Klasse auch mappedBy="user" angegeben hast, muss dementsprechend auch die Variable in der Advert-Klasse heißen. Ansonsten blüht dir nach der ersten Korrektur direkt die nächste Fehlermeldung.

Wenn du später auf den Usernamen zugreifen möchtest, dann geht das via
PHP:
$deinAdvertObjekt->getUser()->getUsername()
Deine Getter musst du natürlich auch entsprechend anpassen. Da wundere ich mich ohnehin, dass du - bis auf eine Ausnahme - keine Getter und Setter hast. Im Falle von Startschwierigkeiten mit Doctrine kann ich, abgesehen von der offiziellen Dokumentation, auch die Tutorials von Marco Pivetta (zwei gute Tutorials sind auf der Seite mit verlinkt)
 
Zuletzt bearbeitet:

Luka

New member
Danke av3nger !!!

Der Grund warum ich string mit angegeben hatte war das ich immer eine Fehlermeldung bekam, die danach verschwand. Aber wenn ich Dich richtig verstanden habe geht es bei dieser Angabe nicht um eine Spalte in der DB sondern um die Relation.

Ich habe es jetzt in der Tat geschafft, es werden endlich die Adverts mit dem zugehoerigen Usernamen angezeigt. Hier mal mein Code, es gibt ja noch andere Einsteiger (ich hoffe mein Code ist dafuer gut genug)

PHP:
namespace Advert\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Advert
 *
 * @ORM\Table(name="advert")
 * @ORM\Entity
 */
class Advert
{
    /**
     * @var integer
     *
     * @ORM\Column(name="advert_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $advertId;

    /**
     * @var integer
     *
     * @ORM\Column(name="advert_user_id", type="integer", nullable=true)
     */
    private $advertUserId;
    
    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="adverts")
     * @ORM\JoinColumn(name="advert_user_id", referencedColumnName="user_id")
     */
    protected $user;
    

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

    /**
     * Get advertId
     *
     * @return integer 
     */
    public function getAdvertId()
    {
        return $this->advertId;
    }

    /**
     * Set advertUserId
     *
     * @param integer $advertUserId
     * @return Advert
     */
    public function setAdvertUserId($advertUserId)
    {
        $this->advertUserId = $advertUserId;

        return $this;
    }

    /**
     * Get advertUserId
     *
     * @return integer 
     */
    public function getAdvertUserId()
    {
        return $this->advertUserId;
    }

    /**
     * Set advertTitle
     *
     * @param string $advertTitle
     * @return Advert
     */
    public function setAdvertTitle($advertTitle)
    {
        $this->advertTitle = $advertTitle;

        return $this;
    }

    /**
     * Get advertTitle
     *
     * @return string 
     */
    public function getAdvertTitle()
    {
        return $this->advertTitle;
    }

    /**
     * Set user
     *
     * @param \Advert\Entity\User $user
     * @return Advert
     */
    public function setUser(\Advert\Entity\User $user = null)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \Advert\Entity\User 
     */
    public function getUser()
    {
        return $this->user;
    }
}
PHP:
namespace Advert\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;


/**
 * User
 *
 * @ORM\Table(name="user", uniqueConstraints={@ORM\UniqueConstraint(name="username", columns={"username"}), @ORM\UniqueConstraint(name="email", columns={"email"})})
 * @ORM\Entity
 */
class User
{
        
    /**
     * @var integer
     *
     * @ORM\Column(name="user_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $userId;

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

    
    /**
     * @ORM\OneToMany(targetEntity="Advert", mappedBy="adverts")
     */
    protected $adverts;
    
    public function __construct()
    {
        $this->adverts = new ArrayCollection();
    }


    /**
     * Get userId
     *
     * @return integer 
     */
    public function getUserId()
    {
        return $this->userId;
    }
    
    
    
    /**
     * Set username
     *
     * @param string $username
     * @return string
     */

    public function setUsername($username)
    {
        $this->username = $username;
    
        return $this;
    }
    
    /**
     * Get username
     *
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * Add adverts
     *
     * @param \Advert\Entity\Advert $adverts
     * @return User
     */
    public function addAdvert(\Advert\Entity\Advert $adverts)
    {
        $this->adverts[] = $adverts;

        return $this;
    }

    /**
     * Remove adverts
     *
     * @param \Advert\Entity\Advert $adverts
     */
    public function removeAdvert(\Advert\Entity\Advert $adverts)
    {
        $this->adverts->removeElement($adverts);
    }

    /**
     * Get adverts
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getAdverts()
    {
        return $this->adverts;
    }
}
In Controller benutzte ich dann folgendes zum Testen:
PHP:
    $data = $this->getEntityManager()->getRepository('Advert\Entity\Advert')->findAll();
        
        foreach($data as $key=>$row)
        {
            echo $row->getAdvertTitle();
            echo $row->getUser()->getUsername();
            echo '<br />';
        }
So, nun muss ich nur mal rausfinden, wie ich eine "where" Bedingung einsetzte und ich brauche eine weitere Relation, da die Adverts in Categories eingeteilt sind, mal schauen ob ich das jetzt so einfach hinbekomme.

Ich vermute ich muss eine weitere Relation dafuer beschreiben, wobei ich diesmal eine Zwischentabelle habe advert2category, da one Advert many categories haben kann. Okay, mal schauen ob ich das hinbekomme.

Nochmal vielen Dank und solltest Du noch einen Fehler sehen oder eine "ungeschickte" Umsetztung .... ich freue mich ueber Kritik, denn nur so kann ich lernen.
 

av3nger

New member
Aber wenn ich Dich richtig verstanden habe geht es bei dieser Angabe nicht um eine Spalte in der DB sondern um die Relation.
Korrekt.

Noch eine Anmerkung zur Avert-Entity: Schmeiß $advertUserId raus. Wenn du die ID benötigen möchtest, greifst du dort via getUserId() deiner User-Entity zu. Also wie auch beim Namen. Die User-Entity sieht auf dem ersten Blick gut aus.

nun muss ich nur mal rausfinden, wie ich eine "where" Bedingung einsetzte
Auch wenn das keine Frage war, beantworte ich das trotzdem noch gerne: findBy oder findOneBy dürften bei den meisten Sachen helfen. Siehe 7. Working with Objects — Doctrine 2 ORM 2.0.0 documentation

Bei umfangreicheren Sachen nutze ich gerne den Query Builder: 13. The QueryBuilder — Doctrine 2 ORM 2.0.0 documentation

Ich vermute ich muss eine weitere Relation dafuer beschreiben, wobei ich diesmal eine Zwischentabelle habe advert2category, da one Advert many categories haben kann. Okay, mal schauen ob ich das hinbekomme.
Im Endeffekt many-to-many, ein Beispiel dafür findest du auch in der Doku auf 6. Association Mapping — Doctrine 2 ORM 2 documentation
 

Luka

New member
Super, vielen Dank !

Ich habe Deine Ratschlaege befolgt. $advertUserId incl getter und setter sind raus.
findBy habe ich ausprobiert, in der einfachen Version geht es, da ich es aber bei den Categories brauche, lasse ich es im Moment noch raus.

Als naechstes brauche ich ja die Relation fuer die Categories, da ich ja auf eine Category klicke und dann nur die Adverts fuer die Category sehen moechte (findBy brauche ich dann). CategoryID und AdvertID stehen in der Tabelle Advert2Category. Ich habe mir Deinen Link zu ManytoMany angesehen und glaube das "Many-To-Many, Bidirectional" die richtige Wahl ist. Ich werde meine Loesung posten, sobald ich es zum Laufen gebracht habe....

Nochmal vielen Dank!
 

Luka

New member
Nach tagelangem Probieren muss ich nun doch nochmal anfragen, wie ich die manytomany Relation umsetzen kann.
Ich habe 3 Tabellen:
tbl Advert
advert_id
advert_title
etc

tbl Category
category_id
name
label
etc

tbl_advert2category
advert2category_category_id
advert2category_advert_id

Ich habe also entschieden das sich um eine ManytoMany Bidirectional handelt. Owning side ist die Advert Entity. (Nein, begruenden kann ich diese Entscheidung nicht)

Ich habe nun folgendes in meinen Code eingebaut:

PHP:
namespace Advert\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Advert
 *
 * @ORM\Table(name="advert")
 * @ORM\Entity
 */
class Advert
{
    /**
     * @var integer
     *
     * @ORM\Column(name="advert_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $advertId;

    
    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="adverts")
     * @ORM\JoinColumn(name="advert_user_id", referencedColumnName="user_id")
     */
    protected $user;
    

 
    /**
     * @var string
     *
     * @ORM\Column(name="advert_title", type="string", length=255, nullable=true)
     */
     private $advertTitle;
     
     
     /**
     * @ORM\ManyToMany(targetEntity="Category", inversedBy="advertCategory", cascade={"persist"})
     * @ORM\JoinTable(name="advert2category",
     * joinColumns={@ORM\JoinColumn(name="advert2category_advert_id", referencedColumnName="id")},
     * inverseJoinColumns={@ORM\JoinColumn(name="advert2category_category_id", referencedColumnName="id")}
     * )
     */
    protected $category;

    public function __construct()
    {
        $this->category = new ArrayCollection();
    }
     
   
    /**
     * Get advertId
     *
     * @return integer 
     */
    public function getAdvertId()
    {
        return $this->advertId;
    }


    /**
     * Set advertTitle
     *
     * @param string $advertTitle
     * @return Advert
     */
    public function setAdvertTitle($advertTitle)
    {
        $this->advertTitle = $advertTitle;

        return $this;
    }

    /**
     * Get advertTitle
     *
     * @return string 
     */
    public function getAdvertTitle()
    {
        return $this->advertTitle;
    }

    /**
     * Set user
     *
     * @param \Advert\Entity\User $user
     * @return Advert
     */
    public function setUser(\Advert\Entity\User $user = null)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \Advert\Entity\User 
     */
    public function getUser()
    {
        return $this->user;
    }
    
    /**
     * Set category
     *
     * @param \Advert\Entity\User $category
     * @return Advert
     */
    public function setCategory(\Advert\Entity\Category $category = null)
    {
        $this->category = $category;
    
        return $this;
    }
    
    /**
     * Get category
     *
     * @return \Advert\Entity\Category
     */
    public function getCategory()
    {
        return $this->category;
    }
}
Meine Category Entity:
PHP:
namespace Advert\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Category
 *
 * @ORM\Table(name="category")
 * @ORM\Entity
 */
class Category
{
    /**
     * @var integer
     *
     * @ORM\Column(name="category_id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $categoryId;

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


    
    /**
     * @ORM\ManyToMany(targetEntity="Advert", mappedBy="category")
     **/
    private $advertCategory;

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

    /**
     * Get categoryId
     *
     * @return integer 
     */
    public function getCategoryId()
    {
        return $this->categoryId;
    }


    /**
     * Set name
     *
     * @param string $name
     * @return Category
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

}
Versuche ich nun jedoch in meinem Controller
PHP:
        echo $row->getAdvertTitle();
        echo $row->getUser()->getUsername();
        echo $row->getCategory()->getName();
Kommt die Fehlermeldung:

Code:
Call to undefined method Doctrine\ORM\PersistentCollection::getName()
Ich habe das Gefuehl bereits das halbe www durchgelesen zu haben, aber bin irgendwie zu daemlich meinen Fehler zu finden. Oh man ist das frustrierend. Kann mir vielleicht jemand nochmal einen Rat geben was ich falsch mache? Danke im Voraus !
 

av3nger

New member
Eigentlich ganz simpel: Dein Advert-Objekt hat mehr als nur eine Kategorie. getCategory() gibt daher kein Category-Objekt (logisch, könnten ja mehrere sein), sondern eine ArrayCollection. Und die hat keine getName()-Methode. Also entweder entscheidest du dich für eine Kategorie pro Advert-Objekt (dann wäre ManyToMany falsch) oder du musst $row->getCategory() in einer foreach-Schleife durchlaufen und für jedes einzelne Kategorie-Objekt den Namen zurückgeben.
 

Luka

New member
Danke av3nger, dass war die Loesung fuer mein Problem !!

Nun sitze ich jedoch bereits seit Tagen an einem weiteren Problem, naemlich die Daten in meine advert2category Tabelle einzutragen. Ich bin eigentlich davon ausgegangen das Doctrine 2 das automatisch macht, da ich ja die ManytoMany Relationship angegeben habe, doch leider passiert das nicht. Ich habe dann rausgefunden das ich eine Add und Remove Methode in meiner Advert Entity brauche, ob die dann so aussehen muss wie bei mir weiss ich jedoch nicht so genau. Dann vermute ich mal als weiteres das die Daten nicht automatisch mit ->persist($advert) und ->flush() eingetragen werden, sondern das ich die addCategories() Methode im Controller in einer foreach Schleife aufrufen muss. Ist das korrekt? Meine Fehlermeldung momentan:
Code:
[SIZE=1]Argument 1 passed to  Advert\Entity\Advert::addCategories() must be an instance of  Doctrine\Common\Collections\ArrayCollection, string given,[/SIZE]

Hier mal meine AdvertEntity soweit:
PHP:
<?php

namespace Advert\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use DateTime;
/** Advert
 * 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 integer
     *
     * @ORM\Column(name="advert_user_id", type="integer", nullable=true)
     */
    private $advertUserId;

    /**
     * @var string
     *
     * @ORM\Column(name="advert_title", type="string", length=255, nullable=true)
     */
    private $advertTitle;  
    
    /** 
     * @var ArrayCollection
     * @ORM\ManyToMany(targetEntity="Category", inversedBy="adverts", cascade={"persist"}) 
     * @ORM\JoinTable(name="advert2category") 
     */
    public $categories;
    
    /** 
     * @ORM\ManyToOne(targetEntity="User", inversedBy="adverts") 
     * @ORM\JoinColumn(name="advert_user_id", referencedColumnName="user_id") 
     */ 
    protected $user;

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

    /** 
     * Set ID 
     * 
     * @param integer $id 
     * @return Advert 
     */ 
    public function setId($id) 
    { 
        $this->id = $id; 
     
        return $this; 
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set advertUserId
     *
     * @param integer $advertUserId
     * @return Advert
     */
    public function setAdvertUserId($advertUserId)
    {
        $this->advertUserId = $advertUserId;

        return $this;
    }

    /**
     * Get advertUserId
     *
     * @return integer 
     */
    public function getAdvertUserId()
    {
        return $this->advertUserId;
    }

    /**
     * Set advertTitle
     *
     * @param string $advertTitle
     * @return Advert
     */
    public function setAdvertTitle($advertTitle)
    {
        $this->advertTitle = $advertTitle;

        return $this;
    }

    /**
     * Get advertTitle
     *
     * @return string 
     */
    public function getAdvertTitle()
    {
        return $this->advertTitle;
    }


    
    /**
     * Set category
     *
     * @param ArrayCollection $category
     * @return Advert
     */
    public function setCategories(ArrayCollection $categories)
    {
        $this->categories = $categories;

        return $this;
    }

    /**
     * Get category
     *
     * @return ArrayCollection
     */
    public function getCategories()
    {
        return $this->categories;
    }
    
    /** 
     * Set user 
     * 
     * @param \Advert\Entity\User $user 
     * @return Advert 
     */ 
    public function setUser(\Advert\Entity\User $user = null) 
    { 
        $this->user = $user; 
     
        return $this; 
    } 
     
    /** 
     * Get user 
     * 
     * @return \Advert\Entity\User 
     */ 
    public function getUser() 
    { 
        return $this->user; 
    }
    
  
    /** 
     * @param Collection $categories 
     */ 
    public function addCategories(ArrayCollection $categories) 
    { 
        foreach ($categories as $category) { 
            $category->setAdvert($this); 
            $this->category->add($category); 
        } 
    }
    
    /** 
     * @param Collection $categories 
     */ 
    public function removeCategories(ArrayCollection $categories) 
    { 
        foreach ($categories as $category) { 
            $category->setAdvert($this); 
            $this->category->remove($category); 
        } 
    }  
}
Und mein Controller:
PHP:
 $sl = $this->getServiceLocator();
        $form = $sl->get('FormElementManager')->get('\Advert\Form\CreateForm');
        
        # create a new, empty entity
        $advert = new Advert();
        
        # set the hydrator to connect form and entity
        $form->setHydrator(new DoctrineHydrator($this->getEntityManager(),'Advert\Entity\Advert'));
        
        # connect form and entity
        $form->bind($advert);
    
        $request = $this->getRequest();
        if ($request->isPost()) {
            $form->setData($request->getPost());
       
            if ($form->isValid()) {
                   foreach($request->getPost('categories') as $category){
                   // was gehoert hier hin?
                    $advert->addCategories($category); 
                }
                // if valid, write changes to database
                $this->getEntityManager()->persist($advert);
                $this->getEntityManager()->flush();
                
            }
        }
Sind meine Gedankengaenge korrekt oder habe ich einen Denkfehler? Ich vermute das mein Sourcecode weit entfernt von perfekt ist und hoere mir gerne Eure Kritik und Anregungen an.
 
Zuletzt bearbeitet:

Luka

New member
Ich kann es kaum glauben aber ich habe es doch noch alleine geloest. (Tagelang geht es nicht, einmal gepostet schwupps bekomme ich es zum Laufen :)

Hier mal mein Sourcecode...
In der Advert Entity :
PHP:
  public function addCategories(ArrayCollection $categories)
    {
        foreach ($categories as $category) {
            $this->categories->add($category);
        }
    }
Und im Controller die Foreach rausnehmen und es geht von ganz alleine. Nun muss ich nur noch "Remove" zum Laufen bringen...
 
Oben