Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
TemKa_SD

JsonSerializable в IPS

Рекомендованные сообщения

Здравствуйте. Имею вот такой файлик с другого движка, это 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

Поделиться сообщением


Ссылка на сообщение

Сделал вот еще одну функцию, мне таск пишет 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';

}

Поделиться сообщением


Ссылка на сообщение
10/25/18 12:34 (изменено)

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

Изменено пользователем TemKa_SD

Поделиться сообщением


Ссылка на сообщение
10/25/18 12:45 (изменено)

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

 

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

Изменено пользователем TemKa_SD

Поделиться сообщением


Ссылка на сообщение

Разобрался, потому что таблица пустая.

Поделиться сообщением


Ссылка на сообщение

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

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

Поделиться сообщением


Ссылка на сообщение
10/25/18 13:43 (изменено)

Пока так:

 

	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 выводить ошибку, что записей в таблице нет?

Изменено пользователем TemKa_SD

Поделиться сообщением


Ссылка на сообщение

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

 

Было:

 

                        $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);
                               }

Поделиться сообщением


Ссылка на сообщение
10/25/18 16:06 (изменено)

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

 

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

 

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

 

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

heroesScore.php

Изменено пользователем TemKa_SD

Поделиться сообщением


Ссылка на сообщение

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

 

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

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

Поделиться сообщением


Ссылка на сообщение

Не читал, обязательно почитаю )

Поделиться сообщением


Ссылка на сообщение

Ничего не понял из документации (((

Поделиться сообщением


Ссылка на сообщение

Допустим нужно достать 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)

{

}

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...