2015-11-02 30 views
0

我將來自外部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); 

回答

1

如果我理解正確的,你要知道,如果存儲的數據從一個API直接拉到表(通過SQL)將與Doctrine一起工作,答案是肯定的。

您可以通過SQL填充表格,Doctrine會根據您的配置(例如註解)查找ID並加載實體。

如果你想堅持PlayerGame實體,你將不得不爲PlayerGame創建(或負載)的實體和你打電話persist()flush()使用前制定者在PlayerGame實體。

+0

感謝您的回答,我將拉動大量的數據,將分開的api調用theres很多其他數據我拉以及它不只是我提到的三個表的情況下,提供我不會調用刷新,直到所有的飼料已被堅持它將涉及的數據好,但如果我沖洗後,每個API餵它不會工作?我用更多的信息更新了我的問題 –

相關問題