Ankündigung

Einklappen
Keine Ankündigung bisher.

Doctrine und Tabellen Beziehungen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Doctrine und Tabellen Beziehungen

    Hallo!

    Ich arbeite mich gerade in Doctrine ein und nutze es in einem eigenem Projekt. Ich bin an dem Punkt angelangt wo ich meine Tabellen mit Doctrine erstelle, was ich früher über SQL gemacht habe.

    Ich habe folgende Entities:

    Contact:
    PHP-Code:
    /**
     * @ORM\Entity
     * @ORM\Table(name="contacts")
     */
    class Contact
    {
        
    /**
         * Id
         * 
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue
         * @ORM\OneToMany(targetEntity="Task", mappedBy="contacts")
         * 
         * @var integer
         */
        
    private int $id 0;

        ...

    Task:

    PHP-Code:
    /**
     * @ORM\Entity
     * @ORM\Table(name="tasks")
     */
    class Task 
    {
        use \
    Traits\IdentifiableTrait;
        use \
    Traits\PropertiesableTrait;
        use \
    Traits\TimestampableTrait;
        
    /**
         * Contact Id
         * 
         * @ORM\Column(type="integer", name="contact_id", nullable=true)
         * @ORM\ManyToOne(targetEntity="Contact", inversedBy="tasks")
         * @ORM\JoinColumn(name="contact_id", referencedColumnName="id")
         * 
         * @var integer
         */
        
    protected int $contactId 0;

        ...

    Soweit so gut. Laut der Doku, https://www.doctrine-project.org/pro...n-mapping.html werden die zweit Tabellen erstellt und mit ALTER der Fremdschlüssel hinzugefügt. Also ich habe 1 Contact zu n Aufgaben. Meine Tabellen werden erstellt, aber ohne Beziehung also task.contact_id zu contact.id. Auch PHPMyAdmin zeigt keine Beziehungen an. Ich muss gestehen ich stehe da auf dem Schlauch und verstehe es nicht. Kann mir jemand mein Problem erklären? Was mache ich evtl. falsch?

    Es ist kein Framework im Einsatz, doctrine habe ich nach eingefügt wie hier beschrieben: https://www.doctrine-project.org/pro...g-started.html

    Danke für die Hilfe.

    MfG

  • #2
    Du hast weder eine Property contacts (dein mappedBy) noch tasks (dein inversedBy)
    Schau dir nochmal an, wie man es richtig macht:
    https://www.doctrine-project.org/pro...-bidirectional

    P.S.: Hiermit kannst du prüfen ob deine Mapping Files korrekt sind:
    php vendor/doctrine/orm/bin/doctrine orm:validate-schema
    (Hierzu musst du allerdings erst eine cli-config.php anlegen)

    Sieht dann so aus wenn alles passt:

    Mapping
    -------

    [OK] The mapping files are correct.


    Database
    --------

    [OK] The database schema is in sync with the mapping files.
    sorry, shift-taste kaputt

    Kommentar


    • #3
      Ja, du hast Recht. Als ich deinen Post lass habe ich mir gedacht, "Äh... Die Doku habe ich doch gelesen!". Gelesen habe ich die, nur falsch verstanden, wie es sich nachträglich herausgestellt hat

      Ich dachte das alles in einer Entity gleich auf die Tabelle umgemünzt wird. Dem ist aber nicht so.

      Task.php:
      PHP-Code:
      /**
       * @ORM\Entity
       * @ORM\Table(name="tasks")
       */
      class Task 
      {
          use \
      Traits\IdentifiableTrait;
          use \
      Traits\PropertiesableTrait;
          use \
      Traits\TimestampableTrait;

      /**
           * Contact Id
           * 
           * @ORM\Column(type="integer", name="contact_id", nullable=true)
           *
           * @var integer
           */

          
      protected int $contactId 0;

          
      /**
           * @ORM\ManyToOne(targetEntity="Contact", inversedBy="tasks")
           * @ORM\JoinColumn(name="contact_id", referencedColumnName="id")
           */
          
      private int $task 0;


         ... 
      Contact:

      PHP-Code:
      /**
       * @ORM\Entity
       * @ORM\Table(name="contacts")
       */
      class Contact
      {
          
      /**
           * Id
           * 
           * @ORM\Id
           * @ORM\Column(type="integer")
           * @ORM\GeneratedValue
           * 
           * @var integer
           */
          
      private int $id 0;

          
      /**
           * @ORM\OneToMany(targetEntity="Task", mappedBy="contact")
           */
          
      private int $tasks 0;

         ... 
      Ich brauche extra Attribute die die references. Diese werden als Spalten in der Tabelle natürlich nicht angelegt.

      Vielen Dank!

      Das mit Validate Shema schaue ich mir auch noch an

      Kommentar


      • #4
        PHP-Code:
            /**
             * @ORM\OneToMany(targetEntity="Task", mappedBy="contact")
             */
            
        private int $tasks 0
        PHP-Code:
            /**
             * @ORM\ManyToOne(targetEntity="Contact", inversedBy="tasks")
             * @ORM\JoinColumn(name="contact_id", referencedColumnName="id")
             */
            
        private int $task 0
        Eigentlich hast du doch in Tasks dann eine Collection mit allen Tasks. Wie kann das Property dann vom Typ Integer sein? Das verwirrt mich etwas in deinem Code!

        Kommentar


        • #5
          Zitat von Zeichen32 Beitrag anzeigen
          PHP-Code:
          /**
          * @ORM\OneToMany(targetEntity="Task", mappedBy="contact")
          */
          private int $tasks 0
          PHP-Code:
          /**
          * @ORM\ManyToOne(targetEntity="Contact", inversedBy="tasks")
          * @ORM\JoinColumn(name="contact_id", referencedColumnName="id")
          */
          private int $task 0
          Eigentlich hast du doch in Tasks dann eine Collection mit allen Tasks. Wie kann das Property dann vom Typ Integer sein? Das verwirrt mich etwas in deinem Code!
          Jetzt sieht es so aus,

          /**
          * @ORM\OneToMany(targetEntity="Task", mappedBy="contact")
          */
          private $tasks;
          [/PHP]

          PHP-Code:
          /**
          * @ORM\ManyToOne(targetEntity="Contact", inversedBy="tasks")
          * @ORM\JoinColumn(name="contact_id", referencedColumnName="id")
          */
          private $task
          Ich kenne mich mit Doctrine nicht so aus. In Zukunft wird es vielleicht besser. Dafür habe ich jetzt ein anderes Problem, das meine contactId immer leer ist, obwohl die Werte bekommt... Aber dafür mache ich wohl einen anderen Thread auf...

          Kommentar

          Lädt...
          X