Jump to content

JsonSerializable в IPS


TemKa_SD
 Share

Recommended Posts

Здравствуйте. Имею вот такой файлик с другого движка, это ActiveRecords и еще тут есть какой-то JsonSerializable.

 

Файлик:

 

<?php

namespace StatsBundle\Entity;

/**
* StatsGameplayerHeroes
*/
class StatsGameplayerHeroes implements \JsonSerializable {
   use MultiKillStatsTrait, StatsHeroTrait, AdditionalStatsTrait;

   /**
    * @var integer
    */
   private $playerId;

   /**
    * Set playerId
    *
    * @param integer $playerId
    *
    * @return StatsGameplayerHeroes
    */
   public function setPlayerId($playerId)
   {
       $this->playerId = $playerId;

       return $this;
   }

   /**
    * Get playerId
    *
    * @return integer
    */
   public function getPlayerId()
   {
       return $this->playerId;
   }


   public function jsonSerialize()
   {
       return [
           'hero' => $this->getHero(),
           'games' => $this->getG(),
           'winrate' => number_format(($this->getW() * 100) / $this->getG(), 2),
           'kd' => number_format($this->getD() > 0 ? $this->getK() / $this->getD() : $this->getK(), 2),
           'ad' => number_format($this->getD() > 0 ? $this->getA() / $this->getD() : $this->getA(), 2),
       ];
   }
}

 

Мне всё понятно кроме подключения implements \JsonSerializable

Link to comment
Share on other sites

Сделал вот еще одну функцию, мне таск пишет Sorry, we could not find that! Всё правильно, проверил раз 20.

 

$heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, ('player_id=1'))->first());

 

<?php

namespace IPS\sharedstats\Entity;

class _StatsGameplayerHeroes extends \IPS\sharedstats\DbIntegration\ActiveRecord
{

   /**
    * @brief    [ActiveRecord] ID Database Column
    */
   public static $databaseColumnId = 'player_id';
   /**
    * @brief   [ActiveRecord] Database ID Fields
    */
   protected static $databaseIdFields = array( 'player_id' );

   /**
    * @brief    [ActiveRecord] Database table
    * @note    This MUST be over-ridden
    */
   public static $databaseTable = 'stats_gameplayer_heroes';

   /**
    * @brief   [ActiveRecord] Database Prefix
    */
   public static $connectionName = 'stats';

}

Link to comment
Share on other sites

Пока закомментировал этот код, вот такая строка подключения в другом движке: $gHeroStats = $em->getRepository('StatsBundle:StatsHeroes')->find($hero); что вместо find использовать? Попробовал load, не помогает.

Edited by TemKa_SD
Link to comment
Share on other sites

Так. Посмотрел в движке, может быть, load и нужен. Я так понимаю, нужно добавить таблицу?

 

Хотя нет. У меня в таблице нет ID, поэтому, load не подходит.

Edited by TemKa_SD
Link to comment
Share on other sites

first() выкидывает исключение, поэтому используйте try/catch

try
{
   $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, ('player_id=1'))->first());
}
catch (\UnderflowException $e)
{
}

Link to comment
Share on other sites

Пока так:

 

	public function execute()
{
	$db = \IPS\sharedstats\DB::get();
	$type = 'dota';
	$hero = '';
	$gameIds = $db->select('g.gameid, d.winner', ['stats_games_scored', 'g'], ['hs.id IS NULL AND type=?', $type], 'g.gameid ASC', 75)->join( array( 'stats_dotagames', 'd' ), 'd.gameid = g.gameid', 'INNER')->join( array( 'stats_heroes_scored', 'hs' ), 'hs.id = g.gameid', 'LEFT');

    try {
    	foreach($gameIds as $game) {
    		$gameId = $game['gameid'];
    		$players = $db->select('d.*, p.*', ['stats_gameplayers', 'p'], ['p.gameid = ? AND TRIM(d.hero) !=?', $gameId, $hero])->join( array( 'stats_dotaplayers', 'd' ), 'd.gameid = p.gameid AND d.newcolour = p.colour', 'INNER');
    		foreach($players as $p) {
    			$dbPlayer = \IPS\sharedstats\Entity\StatsGameplayerScored::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerScored::$databaseTable, (['name=? AND server=?', $p['name'], $p['spoofedrealm']]))->first());

				if($dbPlayer) {
					$hero = $this->getHero(mb_strtoupper($p['hero']));
                       $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, (['hero=? AND player_id=?', $hero, $dbPlayer->getId()]))->first());
                       if (!$heroStats) {
                           $heroStats = new StatsGameplayerHeroes();
                           $heroStats->setPlayerId($dbPlayer->getId());
                           $heroStats->setHero($hero);
                       }
                       $gHeroStats = \IPS\sharedstats\Entity\StatsHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsHeroes::$databaseTable, (['hero=?', $hero]))->first());
                       if (!$gHeroStats) {
                           $gHeroStats = new StatsHeroes();
                           $gHeroStats->setHero($hero);
                       }
				}
    		}
    	}
    } catch(\OutOfRangeException $e) {}

    if(count($gameIds)>0) {
      return 'Hero: ' . json_encode($heroStats);
    }
    else {
    	return 'Игры не найдены';
    }
}

 

Соответственно, здесь $dbPlayer = \IPS\sharedstats\Entity\StatsGameplayerScored::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerScored::$databaseTable, (['name=? AND server=?', $p['name'], $p['spoofedrealm']]))->first()); тоже нужно его использовать?

 

А в catch выводить ошибку, что записей в таблице нет?

Edited by TemKa_SD
Link to comment
Share on other sites

Правильно ли я сделал?

 

Было:

 

                        $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, (['hero=? AND player_id=?', $hero, $dbPlayer->getId()]))->first());
                       if (!$heroStats) {
                           $heroStats = new StatsGameplayerHeroes();
                           $heroStats->setPlayerId($dbPlayer->getId());
                           $heroStats->setHero($hero);
                       }

 

Стало:

 

                            try
                               {
                                   $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, (['hero=? AND player_id=?', $hero, $dbPlayer->getId()]))->first());
                               }
                               catch (\UnderflowException $e)
                               {
                                   $heroStats = new StatsGameplayerHeroes();
                                   $heroStats->setPlayerId($dbPlayer->getId());
                                   $heroStats->setHero($hero);
                               }

Link to comment
Share on other sites

Ну конечно же ПРАВИЛЬНО, у меня ТЕПЕРЬ всё работает как часики, блин, я так рад, что у меня что-то получаться начало и при этом, я понимаю что делаю. Спасибо вам огромнейшее.

 

Еще хочу спросить на счет try и catch, правильно я понял. Их использовать там, где нет больших условий для if else, например:

 

Если у меня условие if (!hero) использовать try. Если условие if ($hero >= 1) уже использовать if else?

 

Я закончил, гляньте пожалуйста на наличие ошибок, как время будет. Функционал рабочий, все функции выполняет и записывает в БД.

heroesScore.php

Edited by TemKa_SD
Link to comment
Share on other sites

Еще хочу спросить на счет try и catch, правильно я понял. Их использовать там, где нет больших условий для if else, например:

 

Если у меня условие if (!hero) использовать try. Если условие if ($hero >= 1) уже использовать if else?

Документацию читали? :)

Link to comment
Share on other sites

Допустим нужно достать 1 запись (таблица постов) из БД с определенной датой

$post = \IPS\Db::i()->select('*', 'forums_posts', array('post_date=?', 1422859622))->first();

Если запись существует, то мы получим массив с данными

Если записи не существует, то будет выброшено исключение UnderflowException, которое нужно поймать

Поэтому оборачиваем код в try/catch

try

{

$post = \IPS\Db::i()->select('*', 'forums_posts', array('post_date=?', 1422859622))->first();

}

catch (\UnderflowException $e)

{

}

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...