亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在單個超級映射類中創建 ManyToOne 關系

如何在單個超級映射類中創建 ManyToOne 關系

PHP
海綿寶寶撒 2022-07-22 09:56:22
我正在為我的無頭 symfony 后端創建一個簡單的 CMS Bundle,我正在嘗試將頁面映射到具有父子關系的頁面(許多孩子到一個父母)并且我有這個類映射超類來創建可重用的代碼,這是一個縮小的我要存檔的示例:use Doctrine\ORM\Mapping as ORM;/** * @ORM\MappedSuperclass() */class Test{    /**     * @ORM\Column(name="id", type="integer")     * @ORM\Id     * @ORM\GeneratedValue(strategy="AUTO")     */    protected $id;    public function getId()    {        return $this->id;    }    /**     * @ORM\ManyToOne(targetEntity="Ziebura\CMSBundle\Entity\Test")     */    protected $parent;    public function getParent()    {        return $this->parent;    }    public function setParent($parent)    {        $this->parent = $parent;    }}然后我將這個類擴展為一個普通實體來創建數據庫表<?phpnamespace App\Entity;use Doctrine\ORM\Mapping as ORM;use Ziebura\CMSBundle\Entity\Test as BaseTest;/** * @ORM\Table(name="test") * @ORM\Entity(repositoryClass="App\Repository\TestRepository") */class Test extends BaseTest{}問題是我得到了這個學說例外Column name `id` referenced for relation from App\Entity\Test towards Ziebura\CMSBundle\Entity\Test does not exist. 我不太明白為什么它會產生這個錯誤,或者我試圖歸檔的東西是不可能的,我已經在映射的超類上做了關系,但它是 2 個或更多表,而不僅僅是一個。我已經嘗試創建 $children 字段,但它沒有工作并且仍然產生上述錯誤。有沒有人嘗試創造類似的東西?我在教義文檔中找不到任何關于此的內容,只找到了如何映射 2 個不同的超類。我想最簡單的方法是在 App 命名空間中指定關系而不是在 Bundle 中,但如果我必須在每個項目中聲明我使用 bundle 的話,這幾乎破壞了可重用代碼的目的。我相信堆棧讓我們弄清楚這一點。謝謝!
查看完整描述

2 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

讓我們閱讀有關此的 Doctrine 文檔:https ://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/inheritance-mapping.html#inheritance-mapping

映射的超類是一個抽象或具體的類,它為其子類提供持久的實體狀態和映射信息,但它本身不是實體。通常,這種映射超類的目的是定義多個實體類共有的狀態和映射信息。

...

映射的超類不能是實體,它不是可查詢的,并且由映射的超類定義的持久關系必須是單向的(僅具有擁有方)。這意味著在映射的超類上根本不可能進行一對多關聯。

根據這個:

  • MappedSuperclass 不能是實體

  • 不能有一對多關系 - 所以如果你將 ManyToOne 定義為同一個類,那么它也會在同一個類上創建 OneToMany - 正如你在上面所讀到的,這是被禁止的。


查看完整回答
反對 回復 2022-07-22
?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

出于某種原因,僅更改 BaseTest 中的完整實體路徑解決了引發異常的應用程序并且它可以工作,如果有人會遇到同樣的問題,請嘗試更改


    /**

     * @ORM\ManyToOne(targetEntity="Ziebura\CMSBundle\Entity\Test")

     */

    protected $parent;


    public function getParent()

    {

        return $this->parent;

    }


    public function setParent($parent)

    {

        $this->parent = $parent;

    }


    /**

     * @ORM\ManyToOne(targetEntity="Test")

     */

    protected $parent;


    public function getParent()

    {

        return $this->parent;

    }


    public function setParent($parent)

    {

        $this->parent = $parent;

    }

如果有人知道為什么必須這樣,我將非常感謝對我的回答發表評論。


查看完整回答
反對 回復 2022-07-22
  • 2 回答
  • 0 關注
  • 151 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號