Zum Inhalt wechseln


speichern einer Referenz in einem Entity


1 reply to this topic

#1 MartinI

    Newbie

  • Members
  • PIP
  • 1 Beiträge:

Geschrieben 19 August 2011 - 13:40

Hallo,

ich bin neu bei Symfony2 bzw. Symfony ueberhaupt angekommen und stehe nun vor einem Problem.
Ich habe bislang mit Hilfe des "books" auf symphony.com eine kleine Anwendung zusammengeschustert.

Nun zu meinem eigentlichen Problem:

Ich habe ein Formular erstellt welches mit einer Entity vernknuepft wird und damit die eigengebenen Daten in die Datenbank schreiben kann. Dies funktioniert soweit auch sehr gut. Dann habe ich mit dem "entity Field Type" ein Dropdown erzeugt welches mir alle Entitys aus der Datenbank anzeigt (value des Optionfields ist die ID der Entity, Anzeigename kommt aus der __toString()-Methode der Entity).

Speichere ich mein Formular nun ab so wird das entsprechende Feld in der Datenbank nicht mit dem in "value" vorhandenen Wert gefuellt.

Hier mein Code:

Controller-Code
<?php

namespace MI\ItemBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

use MI\ItemBundle\Entity\Item;
use MI\ItemBundle\Form\Type\ItemType;


class ItemController extends Controller
{
  /**
   * @Route("/", name="_item_index")
   * @Template()
   */
  public function indexAction()
  {
    return array('name'=>'index');
  }

  /**
   * @Route("/list/{r_page}",
   *        name="_item_list",
   *        defaults={"r_page" = "1"})
   * @Template()
   */
  public function listAction($r_page)
  {
    $aItems = $this->getDoctrine()
      ->getRepository('MIItemBundle:Item')->findAll();

    return array('page'=>$r_page, 'aItems' => $aItems);
  }

  /**
   * @Route("/add", name="_item_add")
   * @Template()
   */
  public function addAction(Request $oRequest)
  {
    $oItem = new Item();
    $oForm = $this->createForm(new ItemType(), $oItem);
    if ($oRequest->getMethod() == 'POST') {
      $oForm->bindRequest($oRequest);
      if ($oForm->isValid()) {
        $oEM = $this->getDoctrine()->getEntityManager();
        $oEM->persist($oItem);
        $oEM->flush();
        
        //return $this->redirect($this->generateUrl('_item_index'));
      };
    };
    
    return array('form' => $oForm->createView());
  }
}

Form-Code:
<?php

namespace MI\ItemBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ItemType extends AbstractType
{
  public function buildForm(FormBuilder $oBuilder, array $options)
  {
    $oBuilder->add('name'  , 'text');
    $oBuilder->add('street', 'text');
    $oBuilder->add('street_number', 'text');
    $oBuilder->add('zip', 'text');
    $oBuilder->add('city', 'text');
    $oBuilder->add('square_meter', 'text');
    $oBuilder->add('description', 'textarea');
    $oBuilder->add('Item', 'entity', array('class' => 'MI\\ItemBundle\\Entity\\Item'));
  }
    
  public function getName()
  {
    return 'ItemForm';
  }
}


Entity-Code
<?php

namespace MI\ItemBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * MI\ItemBundle\Entity\Item
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="MI\ItemBundle\Entity\ItemRepository")
 */
class Item
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

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

    /**
     * @var string $street_number
     *
     * @ORM\Column(name="street_number", type="string", length=10)
     */
    private $street_number;

    /**
     * @var string $zip
     *
     * @ORM\Column(name="zip", type="string", length=10)
     */
    private $zip;

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

    /**
     * @var integer $square_meter
     *
     * @ORM\Column(name="square_meter", type="integer")
     */
    private $square_meter;

    /**
     * @var text $description
     *
     * @ORM\Column(name="description", type="text")
     */
    private $description;


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

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

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

    /**
     * Set street
     *
     * @param string $street
     */
    public function setStreet($street)
    {
        $this->street = $street;
    }

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

    /**
     * Set street_number
     *
     * @param string $streetNumber
     */
    public function setStreetNumber($streetNumber)
    {
        $this->street_number = $streetNumber;
    }

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

    /**
     * Set zip
     *
     * @param string $zip
     */
    public function setZip($zip)
    {
        $this->zip = $zip;
    }

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

    /**
     * Set city
     *
     * @param string $city
     */
    public function setCity($city)
    {
        $this->city = $city;
    }

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

    /**
     * Set square_meter
     *
     * @param integer $squareMeter
     */
    public function setSquareMeter($squareMeter)
    {
        $this->square_meter = $squareMeter;
    }

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

    /**
     * Set description
     *
     * @param text $description
     */
    public function setDescription($description)
    {
        $this->description = $description;
    }

    /**
     * Get description
     *
     * @return text 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set item
     *
     * @param integer $item
     */
    public function setItem($item)
    {
        $this->item = $item;
    }

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

    /**
     *
     * @return text
     */
    public function __toString() {
        return $this->getName();
    }
}

Sende ich das Formular ab wird das Objekt korrekt in die Datenbank geschrieben, lediglich das Feld fuer das verknuepfte Item "item" wird immer mit 0 gefuellt. Kommt aus der __toString() des Entitys eine Zahl raus und wird diese in der Selectbox als Anzeigetext verwendet wird diese auch in die Datenbnak eingetragen.
Ich moechte gerne das die ID eines Items in einem anderen Item gespeichert werden kann um so eine Hierarchie der Items zu erhalten.

Ich hoffe ich habe mich verstaendlich ausgedrueckt und es kann mich jemand mit der Nase auf meinen Fehler stossen.

Gruss Martin

#2 drahreg80

    Newbie

  • Members
  • PIP
  • 1 Beiträge:

Geschrieben 26 August 2011 - 15:11

Habe es mir mal kurz angeschaut und festgestellt, dass du keine Referenzierung im ORM Mapper angegeben hast. Du willst ja wahrscheinlich eine 1:n selbstreferenzierung bauen. Du übergibst dem Formular zwar, dass du eine Entity speichern willst, aber sagst in deinem Entity, dass es sich lediglich um einen Integer Wert handelt.

Die Doku dazu findest du unter:
http://www.doctrine-...elf-referencing