Doctrine Fehler bei Erstellen einer Tabelle im Plugin

Hallo zusammen.

Ich schlage mich seit einiger Zeit mit einem offensichtlich falsch erstellten Query herum und finde meinen Fehler nicht.

Ich folge aktuell dem Beispielplugin aus dem Entwicklerhandbuch (LoremQuestions).

Dabei bekomme ich nachdem ich die Models Question und Answer hinzugefügt habe folgenden Fehler:

  [Doctrine\ORM\ORMException]                                                                                                        
  Column name id referenced for relation from LoremQuestions\Models\Answer towards LoremQuestions\Models\Question does not exist.  

Ich konnte mittlerweile auch bestätigen, dass die Spalte id nicht angelegt  wird von Doctrine.

Danke schon einmal im Vorraus, wenn sich jemand bereit erklärt mir zu helfen.

 

 

Nachfolgend Infos zu System und Dateien

  • php Version: 7.0.13
  • Shopwareversion: 5.4.5
  • Mysql Version: 5.5.61

Hier das Query dazu (von Doctrine erstellt):

CREATE TABLE lorem_questions (
    question INT AUTO_INCREMENT NOT NULL,
    time DATETIME NOT NULL,
    user_id INT DEFAULT NULL,
    article_id INT NOT NULL,
    INDEX IDX_DF824069A76ED395 (user_id),
    INDEX IDX_DF8240697294869C (article_id),
    PRIMARY KEY(question)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'

Hier die Models\Question:

namespace LoremQuestions\Models;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Shopware\Components\Model\ModelEntity;

/**
 * @ORM\Entity(repositoryClass="Repository")
 * @ORM\Table(name="lorem_questions")
 */
class Question extends ModelEntity
{
    /**
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\Column(name="question", type="string", nullable=false)
     */
    private $question;

    /**
     * @ORM\Column(name="time", type="datetime", nullable=false)
     */
    private $time;

    /**
     * @ORM\ManyToOne(targetEntity="Shopware\Models\Customer\Customer")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $customer;

    /**
     * @ORM\ManyToOne(targetEntity="Shopware\Models\Article\Article")
     * @ORM\JoinColumn(name="article_id", referencedColumnName="id", nullable=false)
     */
    protected $article;

    /**
     * @ORM\OneToMany(targetEntity="LoremQuestions\Models\Answer", mappedBy="question", orphanRemoval=true, cascade={"persist"})
     */
    protected $answers;

    public function __construct()
    {
        $this->time = new \DateTime();
        $this->answers = new ArrayCollection();
    }

    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getQuestion()
    {
        return $this->question;
    }

    public function setQuestion($question)
    {
        $this->question = $question;
    }

    public function getTime()
    {
        return $this->time;
    }

    public function setTime($time)
    {
        $this->time = $time;
    }

    public function getCustomer()
    {
        return $this->customer;
    }

    public function setCustomer($customer)
    {
        $this->customer = $customer;
        return $this;
    }

    public function getArticle()
    {
        return $this->article;
    }

    public function setArticle($article)
    {
        $this->article = $article;
        return $this;
    }

    public function getAnswers()
    {
        return $this->answers;
    }

    public function setAnswers($answers)
    {
        return $this->setOneToMany($answers, '\LoremQuestions\Models\Answer', 'answers', 'question');
    }
}

Und schließlich die Models\Answer:

namespace LoremQuestions\Models;

use Doctrine\ORM\Mapping as ORM;
use Shopware\Components\Model\ModelEntity;

/**
 * @ORM\Entity(repositoryClass="Repository")
 * @ORM\Table(name="lorem_answers")
 */
class Answer extends ModelEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\Column(name="time", type="datetime", nullable=false)
     */
    private $time;

    /**
     * @ORM\Column(name="answer", type="string", nullable=false)
     */
    private $answer;

    /**
     * @ORM\ManyToOne(targetEntity="Shopware\Models\Customer\Customer")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $customer;

    /**
     * @ORM\ManyToOne(targetEntity="\LoremQuestions\Models\Question", inversedBy="answers")
     * @ORM\JoinColumn(name="question_id", referencedColumnName="id")
     */
    protected $question;

    public function __construct()
    {
        $this->time = new \DateTime();
    }

    public function getId()
    {
        return $this->id;
    }

    public function getTime()
    {
        return $this->time;
    }

    public function setTime($time)
    {
        $this->time = $time;
    }

    public function getAnswer()
    {
        return $this->answer;
    }

    public function setAnswer($answer)
    {
        $this->answer = $answer;
    }

    public function getCustomer()
    {
        return $this->customer;
    }

    public function setCustomer($customer)
    {
        $this->customer = $customer;
        return $this;
    }

    public function getQuestion()
    {
        return $this->question;
    }

    public function setQuestion($question)
    {
        $this->question = $question;
        return $this;
    }
}

 

Wozu baust du überhaupt ein solches Query?

Beim installieren eines Plugins würde Shopware normalerweise auf Basis der neuen Models die Tabellen eigenhändig anlegen und verknüpfen.

Ich habe das Query nicht gebaut. Das wird von Doctrine erstellt und abgefeuert.

ah okay, das habe ich dann falsch verstanden.

Das Buch verweist doch auf eine Seite mit Download für die im Buch beschriebenen Übungen, das würde ich einfach mal downloaden, entpacken und mit deinen Models vergleichen.

1 Like

Ja. Habs auch nicht so super deutlich geschrieben  Grin

Danke, das werde ich mal ausprobieren. Hab nur das Ebook und scheinbar übersehen, dass es die Sachen auch zum Download gibt.

Werde mich dann zurückmelden.

Ok. Hier meine Rückmeldung:

Es lag weder an Doctrine, noch an dem Beispielplugin.

Ich verstehe es selber nicht so wirklich und wahrscheinlich war es mein eigener Fehler. Trotzdem für die, die es interessiert:

Es war (irgendein) Problem mit der Revisionsnummer und dem dazugehörigne Cache. Erst nachdem ich das entsprechende Cache Verzeichnise von Hand (also nicht im Backend, sondern einfach im Dateisystem) gelöscht habe, hat sich das Problem gelöst und die Tabellen wurden, wie erwartet, angelegt.