0

私は単純な問題を抱えていますが、Doctrine 2 と Zend Forms に縛られているため、専門家からのサポートを得るためにここで試してみてください。

私のエンティティ Team Entity から始めましょう:

/**
 *
 * @ORM\Entity
 * @ORM\Table(name="team")
 * @property string $teamName
 * @property int $teamId
 */
class Team
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer", name="teamId", unique=true);
     */
    protected $teamId;

    /**
     * @ORM\Column(type="string")
     */
    protected $teamName;

    /**
     * @ORM\OneToMany(targetEntity="TeamPlayers", mappedBy="team", cascade={"persist"})
     */
    protected $player;

    /**
     * Magic getter to expose protected properties.
     *
     * @param string $property
     * @return mixed
     */
     public function __get($property)
    {
        return $this->$property;
    }

    /**
     * Magic setter to save protected properties.
     *
     * @param string $property
     * @param mixed $value
     */
    public function __set($property, $value)
    {
        $this->$property = $value;
    }
}

プレーヤー エンティティ:

/**
 *
 * @ORM\Entity
 * @ORM\Table(name="player")
 * @property string $playerName
 * @property int $playerId
 */
class Player
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer", name="playerId", unique=true);
     */
    protected $playerId;

    /**
     * @ORM\Column(type="string")
     */
    protected $playerName;

    /**
     * @ORM\OneToMany(targetEntity="TeamPlayers", mappedBy="player", cascade={"persist"})
     */
    protected $team;

    /**
     * Magic getter to expose protected properties.
     *
     * @param string $property
     * @return mixed
     */
     public function __get($property)
    {
        return $this->$property;
    }

    /**
     * Magic setter to save protected properties.
     *
     * @param string $property
     * @param mixed $value
     */
    public function __set($property, $value)
    {
        $this->$property = $value;
    }
}

チームプレーヤー エンティティ:

/**
 *
 * @ORM\Entity
 * @ORM\Table(name="teamplayer")
 * @property int $teamId
 * @property int $playerId
 */
class TeamPlayer 
{
    /**
     * @ORM\Id
     * @Column(type="integer")
     */
    protected $playerId;

    /**
     * @ORM\Id
     * @Column(type="integer")
     */
    protected $teamId;

    /**
     * @ORM\ManyToOne(targetEntity="Team", inversedBy="player", cascade={"persist"})
     */
    protected $team;

    /**
     * @ORM\ManyToOne(targetEntity="Player", inversedBy="team", cascade={"persist"})
     */
    protected $player;


    /**
     * Set player
     *
     * @param \Entity\Player $player
     */
    public function setPlayer(\Entity\Player $player)
    {
        $this->player = $player;
    }

    /**
     * Get player
     *
     * @return  \Entity\Player
     */
    public function getPlayer()
    {
        return  $this->player;
    }

    /**
     * Set team
     *
     * @param \Entity\Team $team     
     */
    public function setTeam(\Entity\Team $team)
    {
        $this->team = $team;
    }

    /**
     * Get team
     *
     * @return \Entity\Team     
     */
    public function getTeam()
    {
        return $this->team;
    }
}

?>

これで、最初にプレイヤーを追加するための Zend フォームと、チームを追加するための別の Zend フォームができました。ユーザーはチーム名とチーム ID を使用してチームを追加し、最後に特定のチームのプレイヤーを選択できます。プレーヤー。そのため、ユーザーはチームに追加する前に、フォームで複数のプレーヤーを選択できます。

addAction() でコントローラーに選択したプレーヤーを含むチームを追加するときの質問です。これらの関係マッピングをどのように処理すればよいですか? teamplayer テーブルを更新するためのメソッドをさらに追加する必要がありますか? 誰かがコントローラーでそれを行う方法を説明してくれれば、私のような人々が Zend と Doctrine にますます慣れるのに非常に役立ちます。

編集

*Player Table:*

playerId    -- int      -- PK, AI -- Unique
playerName  -- varchar  -- Unique


*Team Table:*

teamId    -- int      -- PK -- Unique
teamName  -- varchar  -- Unique

*TeamPlayer Table:*

playerId  -- int  -- PK, FK -- references player.playerId
teamId    -- int  -- PK, FK -- references team.teamId

PS 個々のテーブルのオブジェクトを永続化する方法や、Doctrine で結合を使用してデータを取得する方法についての知識はありますが、テーブル間のこの種の関係でエンティティを保存する方法はわかりません。したがって、これは学習者の質問と考えてください。

4

1 に答える 1

0

関連付けが間違っていることは別として、モデル設計では、TeamPlayer エンティティが両方の関連付けの所有側になります。したがって、次のようにする必要があります。

$teamPlayer = new TeamPlayer;
$teamPlayer->setPlayer($player);
$teamPlayer->setTeam($team);

$entityManager->persist($teamPlayer);
$entityManager->flush(); 

しかし

ManyToMany アソシエーションを見てください。これにより、アソシエーションとコードが読みやすくなり、記述が少なくなります。

プレーヤー側での関連付けの例:

/**
 * @ManyToMany(targetEntity="Team")
 * @JoinTable(name="Team_Player",
 *      joinColumns={@JoinColumn(name="Player_id", referencedColumnName="id")},
 *      inverseJoinColumns={@JoinColumn(name="Team_id", referencedColumnName="id")}
 *      )
 */
protected $teams;

ManyToManyの教義のドキュメントも確認してください

于 2012-10-02T18:20:43.693 に答える