0

このタイプの関係を実装したい:

ここに画像の説明を入力

クラス SimpleUser には、UserLanguages テーブルで現在のユーザーにバインドされているすべての SimpleLanguage のリストを含む「言語」クラス プロパティが必要です。

クラスを見てください:

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 ! それらは役に立ちません。これらは、データベース内のエンティティの ID を管理するプロパティ $user および $language です!

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」を直接コレクションしたい

現在、これは不可能です。第 3 のエンティティ UserLanguages の代わりに ManyToMany 関係が必要だと思います (あなたの質問はあまり明確ではありません)。

役に立たないエンティティ 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();
    }
}

user_id と language_id を持つ 3 番目のテーブル UserLanguages が作成されます。

ユーザークラスから、1回の使用でリンクされたすべての言語のリストを取得できます:

$languages = $user->getLanguages();

逆に言語の場合:

$users = $language->getUsers();
于 2013-06-15T10:58:47.153 に答える