symfony2 和学说填充来自 api 的数据,关系创建

symfony2 and doctrine populating with data from api, relationship creation

我正在将来自外部 api 的数据存储到学说中,我已经为各种 API 调用创建了表格。

为了让问题简单化,我将解释一些实体:

我的问题是关于定义关系,以及从 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 个实体,您将必须为 PlayerGame 创建(或加载)实体并在 [=10] 中使用设置器=] 实体,然后调用 persist()flush().