2017-05-10 6 views
0

Ich bin relativ neu zu Doctrin 2 und Symfony 3 und Abholung eines Projekts. Ich habe Probleme beim Bearbeiten eines Zuordnungsproblems, wenn ich eine benutzerdefinierte Klasse erstelle.Klasse AppBundle hat keine Assoziation namens

Kurz gesagt, wenn ich laufen die folgenden:

<?php 

    namespace AppBundle\Repository; 

    /** 
    * FormRepository 
    * 
    * This class was generated by the Doctrine ORM. Add your own custom 
    * repository methods below. 
    */ 
    class FormRepository extends \Doctrine\ORM\EntityRepository 
    { 
     public function findWithDocId($id, $clientId=null) { 
      $docId = '2342'; 

      $query = $this->createQueryBuilder('f'); 
      $query->join('f.documentVersion', 'dv'); 
      $query->where('dv.doc_id = :docId')->setParameter('docId', $docId); 
      $query->andWhere('f.id = :id')->setParameter('id',$id); 
      return $query->getQuery()->getOneOrNullResult(); 
     } 
    } 

Ich erhalte die folgende Fehlermeldung:

"cls": "Doctrine\\ORM\\Query\\QueryException", 
    "errors": [ 
    "[Semantical Error] line 0, col 67 near 'dv WHERE dv.doc_id': Error: Class AppBundle\\Entity\\Form has no association named documentVersion" 

Meine Form Entity wie folgt aussieht:

<?php 

namespace AppBundle\Entity; 

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

use JMS\Serializer\Annotation\Groups; 
use JMS\Serializer\Annotation\SerializedName; 
use JMS\Serializer\Annotation\Accessor; 
use JMS\Serializer\Annotation\VirtualProperty; 
use JMS\Serializer\Annotation\Type; 

use Doctrine\Common\Collections\Criteria; 

use JMS\Serializer\Annotation\AccessorOrder; 

/** 
* @ORM\Entity(repositoryClass="AppBundle\Repository\FormRepository") 
* @ORM\Table(name="forms") 
* @AccessorOrder("custom", custom = {"id"}) 
*/ 
class Form { 

    ...... 


    /** 
    * @ORM\OneToOne(targetEntity="AppBundle\Entity\DocumentVersion", inversedBy="form") 
    * @ORM\JoinColumn(name="doc_id", referencedColumnName="id", nullable=false, unique=true, onDelete="CASCADE") 
    * @SerializedName("document_version") 
    * @Groups({"form_details_document"}) 
    */ 
    private $document; 

    ...... 

} 

Und mein Dokument Version Entity sieht so aus:

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

use JMS\Serializer\Annotation\Groups; 

/** 
* @ORM\Entity 
* @ORM\Table(name="document_versions") 
*/ 
class DocumentVersion { 

    ..... 
    /** 
    * @ORM\OneToOne(targetEntity="AppBundle\Entity\Form", mappedBy="document", orphanRemoval=true, cascade={"persist"}) 
    * @Groups({"document_versions"}) 
    */ 
    private $form; 
..... 

Kann mir jemand helfen, was ich falsch mache? Vielen Dank im Voraus!

Antwort

2

Sie haben private $document; in Form definiert die documentVersion Einheit zu halten, so:

$query->join('f.documentVersion', 'dv'); 

Sollte der Name dieser Eigenschaft sein:

$query->join('f.document', 'dv'); 

Grundsätzlich ist der Fehler:

Error: Class AppBundle\Entity\Form has no association named documentVersion

Ich sage, ich versuche, auf DocumentVersion auf Entität Formular zuzugreifen, aber ich kann nicht fin d es/es Getter/Setter

+0

Ahhh Dank dieser nun Sinn macht. Ich dachte in SQL, wo Sie die Tabellen beitreten, aber es ist nicht. Danke vielmals! –

+1

Yeah Doktrin nimmt eine andere Denkweise, Sie müssen im Grunde alle SQL zusammen vergessen und in Objekten denken. Auch wenn Sie 25 pro Monat oder nur einmal knfuniversity Tutorials auf symfony3/doctrine finden können, ist dies sehr nützlich, um mich zu starten. –

3

In Query Builder sollten Sie Eigenschaftsnamen anstelle von SQL-Spaltennamen verwenden.

Sie haben eine Immobilie:

private $document; 

Daher statt:

$query->join('f.documentVersion', 'dv'); 

versuchen mit:

$query->join('f.document', 'dv'); 
+0

Ich hatte die Dokumente so oft gelesen, google dies eine Million Mal! Ich habe nirgendwo gesehen, wo mir gesagt wurde, dass ich den Variablennamen anstelle des Tabellennamens verwenden soll! Vielen Dank dafür! – swifty

Verwandte Themen