簡體   English   中英

Doctrine 2 - 實體通過密鑰持有者表收集了另一個實體

[英]Doctrine 2 - entity have collection of another entities via key holder table

我想實現這種類型的關系:

在此輸入圖像描述

類SimpleUser必須具有“languages”類屬性,該屬性應包含綁定到UserLanguages表中當前用戶的所有SimpleLanguage-s的列表。

請查看課程:

public class SimpleUser {

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=50)
     */
    private $name;

    // what do I type here? I want to have SimpleLanguage[] here
    private $languages;
}

 public class SimpleLanguage {

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=50)
     */
    private $name;
}

 public class UserLanguages {

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;


/**
 * @var integer
 * @ORM\Column(name="user_id", type="integer")
 */
private $userId;

/**
 * @var integer
 * @ORM\Column(name="language_id", type="integer")
 */
private $languageId;

/**
 * @var SimpleUser
 *
 * @ManyToOne(targetEntity="SimpleUser")
 * @JoinColumn(name="userId", referencedColumnName="id")
 */
private $user;

/**
 * @var SimpleLanguage
 *
 * @ManyToOne(targetEntity="SimpleLanguage")
 * @JoinColumn(name="languageId", referencedColumnName="id")
 */
private $language;
}

首先刪除$ userId; 你的班級UserLanguages的$ languageId 它們是無用的,這些是屬性$ user和$ language,它們管理數據庫中實體的id!

這里是如何管理SImpleUser中的語言屬性:

use Doctrine\Common\Collections\ArrayCollection;

// ...

class SimpleUser
{
    //...

    /**
     * @ORM\OneToMany(targetEntity="UserLanguages", mappedBy="user")
     */
    protected $languages;

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

類似於SimpleLanguage:

use Doctrine\Common\Collections\ArrayCollection;

// ...

class SimpleLanguage
{
    //...

    /**
     * @ORM\OneToMany(targetEntity="UserLanguages", mappedBy="language")
     */
    protected $languages;

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

編輯:

我想沒有“UserLanguages”的集合,而是直接從“user_languages”表中收集“SimpleLanguage”

好的,目前這是不可能的,我認為想要一個ManyToMany關系而不是第三個實體UserLanguages(你的問題不是很清楚)!

刪除無用的實體UserLanguages,然后在SimpleUser中:

use Doctrine\Common\Collections\ArrayCollection;

// ...

class SimpleUser
{
    //...

    /**
     * @ORM\ManyToMany(targetEntity="SimpleLanguage", mappedBy="users")
     */
    protected $languages;

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

而SimpleLanguage:

use Doctrine\Common\Collections\ArrayCollection;

// ...

class SimpleLanguage
{
    //...

    /**
     * @ORM\ManyToMany(targetEntity="SimpleUser", mappedBy="languages")
     * @JoinTable(name="UserLanguages")
     */
    protected $users;

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

這將導致第三個表UserLanguages具有user_id和language_id!

您將能夠從用戶類獲取與一次使用鏈接的所有語言的列表:

$languages = $user->getLanguages();

反向語言:

$users = $language->getUsers();

您正在尋找與連接表的單向一對多關系,該連接表在學說中使用@ManyToMany注釋進行描述。 這可能會導致混淆。

你根本不需要粘合UserLanguages類... doctrine會為你處理這個表。

SimpleUser

/**
 * @ORM\ManyToMany(targetEntity="SimpleLanguage", inversedBy="user")
 * @ORM\JoinTable(name="UserLanguages",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="language_id", referencedColumnName="id", unique=true)}
 * )
 */
 protected $languages;

SimpleLanguage

/**
 * @ORM\ManyToMany(targetEntity="SimpleUser", mappedBy="languages")
 */
 protected $user;

現在doctrine將為您創建UserLanguages表並保留id(user_id,language_id)。

此處閱讀有關聯接表的關聯映射的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM