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;
    }
}

TeamPlayer 实体:

/**
 *
 * @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 Forms,最初一个用于添加球员,另一个用于添加团队,用户可以在其中添加具有团队名称和团队 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;

还检查多对多的原则文档

于 2012-10-02T18:20:43.693 回答