0

我想实现这种类型的关系:

在此处输入图像描述

SimpleUser 类必须有一个“语言”类属性,该属性应包含绑定到 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;
}
4

2 回答 2

1

先删除$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();
于 2013-06-15T10:58:47.153 回答
1

您正在寻找与连接表的单向一对多关系,该连接表在学说中使用 @ManyToMany 注释进行了描述。这可能会导致混乱。

您甚至根本不需要粘合的 UserLanguages 类……教义会为您处理好表格。

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;

现在,学说将为您创建 UserLanguages 表并将 id ( user_id , language_id )保留在其中。

在此处阅读有关使用连接表的关联映射的更多信息。

于 2013-06-15T11:58:04.003 回答