我將來自外部API的數據存儲到原則中,我爲各種API調用創建了表。symfony2和從api填充數據的原則,關係創建
爲了讓事情簡單的問題,我將解釋幾個實體:
- 播放器 - 存儲在可供選擇的球員信息(已 一個PlayerID)
- 遊戲 - 遊戲名單,這將是播放(有一個遊戲ID)
- PlayerGame - 玩家對特定的遊戲商店統計(有 PlayerID和遊戲ID)
我的問題是關於定義關係,並且是否堅持api調用的數據足以生成關係。
我堅持從播放器進料和遊戲輸入
數據。當我拉了PlayerGame數據,並堅持它(它有playerID和遊戲ID,這將是一個多對一的關係)將這個參考相關數據正確的只是堅持飼料的數據?
是簡單地定義在實體的關係足以保證我可以像$播放器 - > 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();
}
}
我有這方面設立了遊戲和PlayerGame
提供我用正確的註釋:
與多對多/**
* @ORM\ManyToOne(targetEntity="FantasyPro\DataBundle\Entity\PlayerGame")
* @ORM\JoinColumn(name="playerGame_playerID", referencedColumnName="playerID")
*/
private $playerID;
怎麼樣將這項工作呢?
/**
* @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;
我仍然可以使用建設者和persister我必須存儲的數據和一切都會相關好嗎?
因此,要確保實體存儲正確的,在我的建設者爲PlayerGame我可以使用:
// set the new values for the player
$playerToStore = $em->getRepository('DataBundle:Player')->findBy($player['PlayerID']);
$currentPlayer->setPlayerID($playerToStore);
感謝您的回答,我將拉動大量的數據,將分開的api調用theres很多其他數據我拉以及它不只是我提到的三個表的情況下,提供我不會調用刷新,直到所有的飼料已被堅持它將涉及的數據好,但如果我沖洗後,每個API餵它不會工作?我用更多的信息更新了我的問題 –