2012-04-11 3 views
0

Ich habe ein Formular erstellt, das korrekt zu sein scheint, es hat ein paar Textfelder und ein Auswahlfeld mit einer Liste von Ländern aus einer Tabelle der Länder, die ich habe . Das Auswahlfeld wird korrekt angezeigt, indem die korrekten Werte für den Wert und den Anzeigetext verwendet werden. Wenn ich das Formular jedoch einreichen erhalte ich eine Ausnahme:Symfony 2 Formular nicht speichern von Daten aus auswählen (in verknüpften Tabelle)

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'countryid' cannot be null 

Wenn ich die Datenbanktabelle gesetzt (in PHPMyAdmin) einem Nullwert für das countryid Feld zu ermöglichen, tritt es in den Datensatz ohne Ausnahme, sondern den Eintrag für die countryid ist Null.

mein Controller hat den folgenden Code:

 $duck = new \Wfuk\DuckBundle\Entity\Ducks(); 

    $form = $this->createFormBuilder($duck) 
     ->add('city', 'text') 
     ->add('countryid', 'entity', array('class' => 'WfukDuckBundle:Country', 'property' => 'country')) 
     // cut other fields 
     ->getForm(); 

    if ($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 

    $errors = $this->get('validator')->validate($form); 

    echo $duck->getCountryid(); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getEntityManager(); 
     $em->persist($duck); 
     $em->flush(); 
     return $this->redirect($this->generateUrl('upload_duck_success')); 
     } 

das Echo in dort die __toString Funktion des Landes Objekt zurückgibt, das ein wenig seltsam scheint - aber es ist die volle Landes-Info für das Land in Form gewählt .

in der Ducks.php Klasse:

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

/** 
* Set countryid 
* 
* @param string $countryId 
*/ 
public function setCountryid($countryid) 
{ 
    $this->countryid = $countryid; 
} 

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

Dies ist mein erstes symfony-Projekt, aber ich habe mehrere Male in der docs gewesen und ich denke, alles in Ordnung, muß gesetzt ...

edit:

ich habe ein einrichten join wie folgt: Ducks.php

/** 
* @ORM\ManyToOne(targetEntity="Country", inversedBy="ducks") 
* @ORM\JoinColumn(name="countryid", referencedColumnName="id") 
*/ 
private $country; 

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

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

und auf der Country.php Seite:

/** 
* @ORM\OneToMany(targetEntity="Ducks", mappedBy="country") 
*/ 
protected $ducks; 

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

/** 
* Get ducks 
* 
* @return Doctrine\Common\Collections\Collection 
*/ 
public function getDucks() 
{ 
    return $this->ducks; 
} 

Antwort

2

Was passiert ist, dass die Form zu Enten ein tatsächliches Land Objekt sendet. Sie können dies bestätigen mit:

public function setCountryid($countryid) 
{ 
    if (is_object($countryid)) die('Yep, got a country object.'); 
    $this->countryid = $countryid; 
} 

Es klingt wie Sie nur eine 2-Char-Ländercode speichern möchten? Sie wollen keine tatsächliche Beziehung? Wenn ja, dann könnte dies den Trick:

public function setCountryid($countryid) 
{ 
    if (is_object($countryid)) $countryid = $countryid->getId(); 
    $this->countryid = $countryid; 
} 

Wenn Sie eine tatsächliche normale Lehre verwaltet Beziehung zwischen Ente und Land dann so etwas wie:

/** 
* @ORM\ManyToOne(targetEntity="Country") 
* @ORM\JoinColumn(name="country_id", referencedColumnName="id") 
*/ 
*/ 
private $country; 

und passen Sie Ihre Getter/Setter entsprechend.

Es ist ein bisschen komisch, dass Sie sowohl Yml und Anmerkungen zu haben scheinen. Von dem, was ich verstanden habe, könntest du das eine oder andere in einem bestimmten Bündel verwenden.

+0

Hallo, vielen Dank für Ihre Antwort. Du hast recht, dass es ein Objekt ist und dein Code, um es in den zweistelligen Ländercode umzuwandeln, so wie mein Echo nur den Code und nicht das komplette Länderobjekt widerspiegelt, aber ich bekomme immer noch den gleichen Fehler, den 'countryid' nicht hat be null 'Ich habe meinen Join-Code zur ursprünglichen Frage hinzugefügt, da dies möglicherweise ein Fehler ist. Idealerweise möchte ich eine Doktrin-verwaltete Beziehung verwenden. Ich habe auch die Datei entends.orm.yml entfernt, falls das Problem verwirrend war. –

+0

Ok. Im ersten Schritt lesen Sie das Doktrin-Handbuch zu Assoziationen: http://docs.doctrine-project.org/en/latest/reference/association-mapping.html. Da Sie mit Objekten zu tun haben, werden Sie all diese "countryid" Sachen los. Beginnen Sie dann mit einer One-Way-ManyToOne-Beziehung von Ente zu Land. Holen Sie sich das arbeiten, dann fügen Sie in der Grafschaft zu Ente Beziehung, wenn Sie es wirklich brauchen.Wenn Sie immer noch Probleme haben, löschen Sie die meisten Ihrer ursprünglichen Fragen und posten Sie einfach Ihre aktualisierten Enten/Ländercodes. Sie können auch einen Symfony 2-Befehl hinzufügen und über die Befehlszeile testen. – Cerad

+0

Sie haben Recht das ganze country_id Ding war unnötig, ich entfernte das und änderte ein paar Zeilen Code und alles hat perfekt funktioniert. Ich schätze die Hilfe sehr - danke. –

Verwandte Themen