symfony2 和学说填充来自 api 的数据,关系创建
symfony2 and doctrine populating with data from api, relationship creation
我正在将来自外部 api 的数据存储到学说中,我已经为各种 API 调用创建了表格。
为了让问题简单化,我将解释一些实体:
- 球员 - 存储可供选择的球员信息(有
一个 PlayerID)
- 游戏 - 将玩的游戏列表(具有 GameID)
- PlayerGame - 存储特定游戏玩家的统计数据(有
玩家 ID 和游戏 ID)
我的问题是关于定义关系,以及从 api 调用中保留数据是否足以生成关系。
我保留来自玩家源和游戏源的数据
当我提取 PlayerGame 的数据并保存它时(它具有 playerID 和 GameID,这将是一个 ManyToOne 关系)是否仅通过保存 feed 中的数据就能正确引用相关数据?
只是定义实体中的关系足以确保我可以执行类似 $player->getGames()
的操作
额外信息
我已经设置了负责创建我需要保留的实体的构建器:
<?php
namespace FantasyPro\DataBundle\Builder;
use FantasyPro\DataBundle\Entity\Player;
use FantasyPro\DataBundle\Helpers\DateHelper;
class PlayerBuilder
{
/**
* @var DateHelper $dateHelper
*/
private $dateHelper;
public function __construct( DateHelper $dateHelper )
{
$this->dateHelper = $dateHelper;
}
public function buildPlayer( $currentPlayer = null, $player )
{
if ( ! $currentPlayer) {
$currentPlayer = new Player();
}
// set the new values for the player
$currentPlayer->setPlayerID( $player['PlayerID'] );
$currentPlayer->setTeam( $player['Team'] );
$currentPlayer->setNumber( $player['Number'] );
$currentPlayer->setFirstName( $player['FirstName'] );
$currentPlayer->setLastName( $player['LastName'] );
$currentPlayer->setPosition( $player['Position'] );
$currentPlayer->setStatus( $player['Status'] );
$currentPlayer->setHeight( $player['Height'] );
$currentPlayer->setWeight( $player['Weight'] );
$currentPlayer->setBirthDate( $this->dateHelper->parseDate( $player['BirthDate'] ) );
$currentPlayer->setCollege( $player['College'] );
$currentPlayer->setExperience( $player['Experience'] );
$currentPlayer->setFantasyPosition( $player['FantasyPosition'] );
$currentPlayer->setActive( $player['Active'] );
$currentPlayer->setPositionCategory( $player['PositionCategory'] );
$currentPlayer->setName( $player['Name'] );
$currentPlayer->setAge( $player['Age'] );
$currentPlayer->setExperienceString( $player['ExperienceString'] );
$currentPlayer->setBirthDateString( $player['BirthDateString'] );
$currentPlayer->setPhotoUrl( $player['PhotoUrl'] );
$currentPlayer->setByeWeek( $player['ByeWeek'] );
$currentPlayer->setUpcomingGameOpponent( $player['UpcomingGameOpponent'] );
$currentPlayer->setUpcomingGameWeek( $player['UpcomingGameWeek'] );
$currentPlayer->setShortName( $player['ShortName'] );
$currentPlayer->setAverageDraftPosition( $player['AverageDraftPosition'] );
$currentPlayer->setDepthPositionCategory( $player['DepthPositionCategory'] );
$currentPlayer->setDepthPosition( $player['DepthPosition'] );
$currentPlayer->setDepthOrder( $player['DepthOrder'] );
$currentPlayer->setDepthDisplayOrder( $player['DepthDisplayOrder'] );
$currentPlayer->setCurrentTeam( $player['CurrentTeam'] );
$currentPlayer->setCollegeDraftTeam( $player['CollegeDraftTeam'] );
$currentPlayer->setCollegeDraftYear( $player['CollegeDraftYear'] );
$currentPlayer->setCollegeDraftRound( $player['CollegeDraftRound'] );
$currentPlayer->setCollegeDraftPick( $player['CollegeDraftPick'] );
$currentPlayer->setIsUndraftedFreeAgent( $player['IsUndraftedFreeAgent'] );
$currentPlayer->setHeightFeet( $player['HeightFeet'] );
$currentPlayer->setHeightInches( $player['HeightInches'] );
$currentPlayer->setUpcomingOpponentRank( $player['UpcomingOpponentRank'] );
$currentPlayer->setUpcomingOpponentPositionRank( $player['UpcomingOpponentPositionRank'] );
$currentPlayer->setCurrentStatus( $player['CurrentStatus'] );
$currentPlayer->setUpcomingSalary( $player['UpcomingSalary'] );
return $currentPlayer;
}
}
坚持者:
namespace FantasyPro\DataBundle\Persisters;
use Doctrine\ORM\EntityManager;
use FantasyPro\DataBundle\Builder\PlayerBuilder;
use FantasyPro\DataBundle\Entity\Player;
class PlayerPersister
{
/**
* @var EntityManager $em
*/
private $em;
/**
* @var PlayerBuilder $builder
*/
private $builder;
public function __construct( EntityManager $em, PlayerBuilder $builder )
{
$this->em = $em;
$this->builder = $builder;
}
public function Persist( $player )
{
//get the player repository
$repo = $this->em->getRepository( 'DataBundle:Player' );
$uow = $this->em->getUnitOfWork();
// Set the current player to fetch from the db
$criteria = array( 'playerID' => $player['PlayerID'] );
//get the player from the repo
/**
* @var Player $currentPlayer
*/
$currentPlayer = $repo->FindOneBy( $criteria );
//build the player entity
$currentPlayer = $this->builder->buildPlayer( $currentPlayer, $player );
$exists = $uow->isEntityScheduled( $currentPlayer );
if ( ! $exists) {
//persist the player
$this->em->persist( $currentPlayer );
$this->em->flush();
$this->em->clear();
}
}
我已经为 Game 和 PlayerGame 设置了这些
前提是我使用了正确的注解:
/**
* @ORM\ManyToOne(targetEntity="FantasyPro\DataBundle\Entity\PlayerGame")
* @ORM\JoinColumn(name="playerGame_playerID", referencedColumnName="playerID")
*/
private $playerID;
ManyToMany 也可以吗?
/**
* @ORM\ManyToMany(targetEntity="FantasyPro\DataBundle\Entity\Player", inversedBy="playerID")
* @ORM\JoinTable(
* name="player_playerGame",
* joinColumns={@ORM\JoinColumn(name="playerID", referencedColumnName="playerID", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="playerGameID", referencedColumnName="playerGameID", nullable=false)}
* )
*/
public $playerID;
我仍然可以使用我必须存储数据的构建器和持久器,一切都会关联好吗?
因此,为了确保正确存储实体,在我的 PlayerGame 构建器中我可以使用:
// set the new values for the player
$playerToStore = $em->getRepository('DataBundle:Player')->findBy($player['PlayerID']);
$currentPlayer->setPlayerID( $playerToStore );
如果我理解正确,你想知道,如果将你从 API 中提取的数据直接存储到 table(通过 SQL)将与 Doctrine 一起工作,答案是的。
您可以通过 SQL 填充 table,Doctrine 将根据您的配置(例如注释)查找 ID 并加载实体。
如果您想保留 PlayerGame
个实体,您将必须为 Player
和 Game
创建(或加载)实体并在 [=10] 中使用设置器=] 实体,然后调用 persist()
和 flush()
.
我正在将来自外部 api 的数据存储到学说中,我已经为各种 API 调用创建了表格。
为了让问题简单化,我将解释一些实体:
- 球员 - 存储可供选择的球员信息(有 一个 PlayerID)
- 游戏 - 将玩的游戏列表(具有 GameID)
- PlayerGame - 存储特定游戏玩家的统计数据(有 玩家 ID 和游戏 ID)
我的问题是关于定义关系,以及从 api 调用中保留数据是否足以生成关系。
我保留来自玩家源和游戏源的数据
当我提取 PlayerGame 的数据并保存它时(它具有 playerID 和 GameID,这将是一个 ManyToOne 关系)是否仅通过保存 feed 中的数据就能正确引用相关数据?
只是定义实体中的关系足以确保我可以执行类似 $player->getGames()
的操作额外信息
我已经设置了负责创建我需要保留的实体的构建器:
<?php
namespace FantasyPro\DataBundle\Builder;
use FantasyPro\DataBundle\Entity\Player;
use FantasyPro\DataBundle\Helpers\DateHelper;
class PlayerBuilder
{
/**
* @var DateHelper $dateHelper
*/
private $dateHelper;
public function __construct( DateHelper $dateHelper )
{
$this->dateHelper = $dateHelper;
}
public function buildPlayer( $currentPlayer = null, $player )
{
if ( ! $currentPlayer) {
$currentPlayer = new Player();
}
// set the new values for the player
$currentPlayer->setPlayerID( $player['PlayerID'] );
$currentPlayer->setTeam( $player['Team'] );
$currentPlayer->setNumber( $player['Number'] );
$currentPlayer->setFirstName( $player['FirstName'] );
$currentPlayer->setLastName( $player['LastName'] );
$currentPlayer->setPosition( $player['Position'] );
$currentPlayer->setStatus( $player['Status'] );
$currentPlayer->setHeight( $player['Height'] );
$currentPlayer->setWeight( $player['Weight'] );
$currentPlayer->setBirthDate( $this->dateHelper->parseDate( $player['BirthDate'] ) );
$currentPlayer->setCollege( $player['College'] );
$currentPlayer->setExperience( $player['Experience'] );
$currentPlayer->setFantasyPosition( $player['FantasyPosition'] );
$currentPlayer->setActive( $player['Active'] );
$currentPlayer->setPositionCategory( $player['PositionCategory'] );
$currentPlayer->setName( $player['Name'] );
$currentPlayer->setAge( $player['Age'] );
$currentPlayer->setExperienceString( $player['ExperienceString'] );
$currentPlayer->setBirthDateString( $player['BirthDateString'] );
$currentPlayer->setPhotoUrl( $player['PhotoUrl'] );
$currentPlayer->setByeWeek( $player['ByeWeek'] );
$currentPlayer->setUpcomingGameOpponent( $player['UpcomingGameOpponent'] );
$currentPlayer->setUpcomingGameWeek( $player['UpcomingGameWeek'] );
$currentPlayer->setShortName( $player['ShortName'] );
$currentPlayer->setAverageDraftPosition( $player['AverageDraftPosition'] );
$currentPlayer->setDepthPositionCategory( $player['DepthPositionCategory'] );
$currentPlayer->setDepthPosition( $player['DepthPosition'] );
$currentPlayer->setDepthOrder( $player['DepthOrder'] );
$currentPlayer->setDepthDisplayOrder( $player['DepthDisplayOrder'] );
$currentPlayer->setCurrentTeam( $player['CurrentTeam'] );
$currentPlayer->setCollegeDraftTeam( $player['CollegeDraftTeam'] );
$currentPlayer->setCollegeDraftYear( $player['CollegeDraftYear'] );
$currentPlayer->setCollegeDraftRound( $player['CollegeDraftRound'] );
$currentPlayer->setCollegeDraftPick( $player['CollegeDraftPick'] );
$currentPlayer->setIsUndraftedFreeAgent( $player['IsUndraftedFreeAgent'] );
$currentPlayer->setHeightFeet( $player['HeightFeet'] );
$currentPlayer->setHeightInches( $player['HeightInches'] );
$currentPlayer->setUpcomingOpponentRank( $player['UpcomingOpponentRank'] );
$currentPlayer->setUpcomingOpponentPositionRank( $player['UpcomingOpponentPositionRank'] );
$currentPlayer->setCurrentStatus( $player['CurrentStatus'] );
$currentPlayer->setUpcomingSalary( $player['UpcomingSalary'] );
return $currentPlayer;
}
}
坚持者:
namespace FantasyPro\DataBundle\Persisters;
use Doctrine\ORM\EntityManager;
use FantasyPro\DataBundle\Builder\PlayerBuilder;
use FantasyPro\DataBundle\Entity\Player;
class PlayerPersister
{
/**
* @var EntityManager $em
*/
private $em;
/**
* @var PlayerBuilder $builder
*/
private $builder;
public function __construct( EntityManager $em, PlayerBuilder $builder )
{
$this->em = $em;
$this->builder = $builder;
}
public function Persist( $player )
{
//get the player repository
$repo = $this->em->getRepository( 'DataBundle:Player' );
$uow = $this->em->getUnitOfWork();
// Set the current player to fetch from the db
$criteria = array( 'playerID' => $player['PlayerID'] );
//get the player from the repo
/**
* @var Player $currentPlayer
*/
$currentPlayer = $repo->FindOneBy( $criteria );
//build the player entity
$currentPlayer = $this->builder->buildPlayer( $currentPlayer, $player );
$exists = $uow->isEntityScheduled( $currentPlayer );
if ( ! $exists) {
//persist the player
$this->em->persist( $currentPlayer );
$this->em->flush();
$this->em->clear();
}
}
我已经为 Game 和 PlayerGame 设置了这些
前提是我使用了正确的注解:
/**
* @ORM\ManyToOne(targetEntity="FantasyPro\DataBundle\Entity\PlayerGame")
* @ORM\JoinColumn(name="playerGame_playerID", referencedColumnName="playerID")
*/
private $playerID;
ManyToMany 也可以吗?
/**
* @ORM\ManyToMany(targetEntity="FantasyPro\DataBundle\Entity\Player", inversedBy="playerID")
* @ORM\JoinTable(
* name="player_playerGame",
* joinColumns={@ORM\JoinColumn(name="playerID", referencedColumnName="playerID", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="playerGameID", referencedColumnName="playerGameID", nullable=false)}
* )
*/
public $playerID;
我仍然可以使用我必须存储数据的构建器和持久器,一切都会关联好吗?
因此,为了确保正确存储实体,在我的 PlayerGame 构建器中我可以使用:
// set the new values for the player
$playerToStore = $em->getRepository('DataBundle:Player')->findBy($player['PlayerID']);
$currentPlayer->setPlayerID( $playerToStore );
如果我理解正确,你想知道,如果将你从 API 中提取的数据直接存储到 table(通过 SQL)将与 Doctrine 一起工作,答案是的。
您可以通过 SQL 填充 table,Doctrine 将根据您的配置(例如注释)查找 ID 并加载实体。
如果您想保留 PlayerGame
个实体,您将必须为 Player
和 Game
创建(或加载)实体并在 [=10] 中使用设置器=] 实体,然后调用 persist()
和 flush()
.