• 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 Entity wird nicht gespeichert

KnechtRootRecht

New member
Nach dem absenden eines Formulares wird meine Entity nicht in die DB eingetragen, obwohl die Werte gesetzt sind bekomme ich diese Fehlermeldung:
An exception occurred while executing 'INSERT INTO teams (teamname, lokaleId, day) VALUES (?, ?, ?)' with params ["Foo", null, null]:SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'lokaleId' cannot be null
Klar versteh ich auch was diese mir sagt, aber das komische ist, ich setzte ja Explizit in einem Debug-Case diese lokaleId:

PHP:
oTeamsEntity2 = new Teams();
$oTeamsEntity2->setTeamname('Foo');
$oTeamsEntity2->setLokaleId(1);
 
$oEm->persist($oTeamsEntity2);
$oEm->flush();
trotzdem bekomme ich diese Meldung...

hier die Entity:
PHP:
<?php
namespace Teams\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/** * Teams *  
* @ORM\Entity 
* @ORM\Table(name="teams") 
* @property int $id 
* @property string $teamname 
* @property int $lokaleId 
* @property int $day  
*/
class Teams{    
/**   
* @ORM\Id    
* @ORM\Column(type="integer");    
* @ORM\GeneratedValue(strategy="AUTO")    
*/    
protected $id;        

/**     
*    
 * @ORM\OneToMany(targetEntity="User\Entity\User", mappedBy="team")     
*/    
protected $users;       

 /**    
* @ORM\Column(type="string")    
*/    
protected $teamname;        

/**    
* @ORM\Column(type="integer")    
*/    
protected $lokaleId;        
/**    
*    
* @ORM\ManyToOne(targetEntity="Teams\Entity\Lokale")    
* @ORM\JoinColumn(name="lokaleId", referencedColumnName="id")    
*/
protected $lokal;       

 /**    
* @ORM\Column(type="integer")   
*/    
protected $day;            

public function __construct() {       
 $this->users = new ArrayCollection();    
} 
   
public function getId() {       
 return $this->id;    
}        
public function setId($id) {
        $this->id = $id;
        return $this;   
}         

public function getTeamname() {
        return $this->teamname;    
}        

public function setTeamname($teamname) {
        $this->teamname = $teamname; 
       return $this;    
}            

public function getDay() {
        return $this->day;    
}
    public function setDay($day) {
        $this->day = $day;        
return $this;    
}
    public function getLokaleId() {
        return $this->lokaleId;   
 }
    public function setLokaleId($id) {
        $this->lokaleId = $id;       
 return $this;   
}
    public function getLokal() {
        return $this->lokal;    
}
    public function setLokal($lokal) {
        $this->lokal = $lokal;        
return $this;   
 }



}
 

[-UFO-]Melkor

New member
Ich tippe mal, das Problem liegt in dem: @ORM\JoinColumn(name="lokaleId", referencedColumnName="id"). Du nutzt die Spalte lokaleId sowohl als JoinColumn als auch als Property.
 

KnechtRootRecht

New member
Ja, mit dieser verweiße ich auf eine andere Tabelle, aber wie bekomme ich dann dort die ID des lokales rein wenn er die Entity so nicht speichert?
Oder muss ich mir die Lokale-Entity dann holen mit dier im Post übergebenen ID und diese dann übergeben?
 
Zuletzt bearbeitet:

av3nger

New member
Im Endeffekt hat der setter, den du verwendet hast, nichts bewirkt. Denn für das SQL-Statement wird auf die Annotationen zurückgegriffen, nicht auf die Namen der Variablen in der Entity. Somit ist das zu verwendende Feld immer noch null.

Du musst nicht die ID setzen, sondern ein Lokale-Objekt. Doctrine weiß dann, wie damit umzugehen ist. Deine lokaleid-Property kannst du jedenfalls rausschmeißen, die wirst du nicht benötigen. Zur Verdeutlichung:

PHP:
$oTeamsEntity2 = new Teams();
$lokaleEntity = new Lokale(); // als Beispiel. Hier würdest du dir vermutlich eher per find() o. ä. das passende Objekt schnappen
$oTeamsEntity2->setTeamname('Foo');
$oTeamsEntity2->setLokale($lokaleEntity); 
$oEm->persist($oTeamsEntity2);
$oEm->flush();
 

KnechtRootRecht

New member
So hab ich mir das in etwa auch gedacht im nachhinein.
Wobei aber der Setter für das Lokale-Object ja nur auf diese Property verweißt.
Ich hab das Property "lokaleId" eigentlich nur drin, damit ich auch prüfen kann ob es dazu einen Wert in einer anderen tabelle gibt.
Wenn ich mir über "getLokale()" das Object der entfernten tabelle hole, es aber keinen Wert dazu gibt in der tabelle, erhalte ich einen Error von Doctrine.
 

av3nger

New member
Wobei aber der Setter für das Lokale-Object ja nur auf diese Property verweißt.
setLokale() weist der lokale-Property die Lokale-Entity zu, korrekt. Mehr brauchst du eigentlich auch nicht. Wenn du die ID mal wirklich brauchen solltest, rufst du diese per getLokale()->getId() ab.

Ich hab das Property "lokaleId" eigentlich nur drin, damit ich auch prüfen kann ob es dazu einen Wert in einer anderen tabelle gibt.
Wenn ich mir über "getLokale()" das Object der entfernten tabelle hole, es aber keinen Wert dazu gibt in der tabelle, erhalte ich einen Error von Doctrine.
Da ich den Fehler nicht kenne, meine Vermutung: Du versuchst auf Eigenschaften der Lokale-Entity zurückgreifen. Denn getLokale() selbst sollte NULL zurückgeben, erst wenn du getLokale()->getIrgendwas() aufrufst, müsstest du den Fehler "Call to a member function of a non-object" oder so erhalten.

Anderenfalls wäre es gut, wenn du mal die genaue Meldung postest und evtl. auch mal die Lokale-Entity.
 

KnechtRootRecht

New member
Danke av3nger, hab das soweit hinbekommen dank deiner Hilfe.
Jetzt hab ich allerdings ein anderes Problem.
Habe eine Bidirektionale Relation von Teams zu Ligen und umgekehrt.

Jedes Team hat eine "liga_id", wenn ich jetzt über Ligen->getTeams() mir die Teams der jeweiligen Liga holen möchte, bekomm ich einen Fehler wenn zu der Liga keine Teams vorhanden sind.

Teams\Entity\Teams:
PHP:
<?phpnamespace Teams\Entity;
use Doctrine\ORM\Mapping as ORM;use Doctrine\Common\Collections\ArrayCollection;
/** * Teams *  
* @ORM\Entity 
* @ORM\Table(name="teams") 
*/
class Teams{    
/**    
* @ORM\Id    
* @ORM\Column(type="integer");    
* @ORM\GeneratedValue(strategy="AUTO")    
*/    
protected $id;       

 /**     
*     
* @ORM\OneToMany(targetEntity="User\Entity\User", mappedBy="team")    
 */    
protected $users;        

/**    
* @ORM\Column(type="string")    
*/    
protected $teamname;             

/**    
*    
* @ORM\ManyToOne(targetEntity="Teams\Entity\Lokale")    
*/
  protected $lokal;        
/**        
* @ORM\ManyToOne(targetEntity="Ligen\Entity\Ligen", inversedBy="teams")     
*/    
protected $liga;        
/**    
* @ORM\Column(type="integer")    
*/    
protected $day;            

public function __construct() {
        $this->users = new ArrayCollection();    
}                
public function getId() {
        return $this->id;    
}
       
public function setId($id) {
        $this->id = $id;
        return $this;    
}        
 
public function getTeamname() {
        return $this->teamname;    
}        

public function setTeamname($teamname) {
        $this->teamname = $teamname;
        return $this;    
}            

public function getDay() {
        return $this->day;    
}
public function setDay($day) {
        $this->day = $day;       
 return $this;    
}
    
public function getLokal() {
        return $this->lokal;    
}
    
public function setLokal($lokal) {
        $this->lokal = $lokal;        
       return $this;    
}        

public function getLiga() {        
    return $this->liga;    
}
    
public function setLiga($liga) {
        $this->liga = $liga;
        return $this;    
}
    
public function getUsers() {
        return $this->users;    
}
   
public function setUsers($users) {
        $this->users = $users;
        return $this;    
}
}
Ligen\Entity\Ligen:
PHP:
<?php
namespace Ligen\Entity;
use Doctrine\ORM\Mapping as ORM;use Doctrine\Common\Collections\ArrayCollection;
/** * Ligen *
* @ORM\Entity * @ORM\Table(name="ligen") 
*/

class Ligen {
/**     
* @ORM\Id     
* @ORM\Column(type="integer");    
 * @ORM\GeneratedValue(strategy="AUTO")     
*/    

protected $id;
    
/**     
* @ORM\Column(type="string", length=255)     
*/    
protected $liganame;
   
 /**     
*     
* @ORM\OneToMany(targetEntity="Teams\Entity\Teams", mappedBy="liga")     
*/    
protected $teams;


    
/**     
* @ORM\Column(type="integer")     
*/    
protected $sort;            

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

public function getId() {
        return $this->id;    
}
    
public function setId($id) {
        $this->id = $id;
        return $this;    
}
    
public function getLiganame() {
        return $this->liganame;    
}
   
public function setLiganame($liganame) {
        $this->liganame = $liganame;
        return $this;    
}
    
public function getSort() {
        return $this->sort;    
}
    
public function setSort($sort) {
        $this->sort = $sort;
        return $this;    
}
    
public function getTeams() {
        return $this->teams;    
}
    
public function setTeams($teams) {
        $this->teams = $teams;
        return $this;    
}}
Liegt das am ForeignKey?

Catchable fatal error: Object of class Doctrine\ORM\PersistentCollection could not be converted to string
 
Zuletzt bearbeitet:

av3nger

New member
Die Entities sehen soweit gut aus. Bei der Liga-Entity würde ich jedoch noch addTeams() und removeTeams() hinzufügen, zumindest habe ich letztens erst bemerkt, dass ich die benötige, wenn ich z. B. via Formulare Einträge hinzfügen/entfernen möchte. Dafür verweise ich mal auf Example 3 auf https://github.com/doctrine/DoctrineModule/blob/master/docs/hydrator.md

Zum eigentlichen Problem: Kannst du die Stelle zeigen, an welcher du getTeams() aufrufst? Das sieht eher so aus, als würdest du das mit einem echo o. ä. ausgeben wollen. Sieht zumindest nach einem Aufruf aus, der für Strings gedacht ist - und die Rückgabe ist ja entweder null oder ein Objekt. Wenn du das nur auflisten möchtest, musst du die via foreach-Schleife durchgehen - evtl. klappt auch explode().
 

KnechtRootRecht

New member
Das ist richtig, ich gebe es mit echo aus. Ich hol mi4 die rows aus dem repositry mit findall und geh diese in der view per foreach durch. Also vorher prüfen ob es null ist, wenn nicht dann ausgeben. Werd ich morgen mal testen.


EDit: und genauso gehts auch

PHP:
$oRepository = $oEntityManager->getRepository('Ligen\Entity\Ligen');
$aRows = $oRepository->findAll();

foreach ($aRows as $oLiga) {
    echo $oLiga->getLiganame() . '<br />';

    foreach ($aLiga->getTeams() as $oTeam) {
       echo $oTeam->getTeamname() . '<br />';
    }
}
 
Zuletzt bearbeitet:
Oben