TemKa_SD 9 10/25/18 11:43 Здравствуйте. Имею вот такой файлик с другого движка, это 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 Поделиться сообщением Ссылка на сообщение
newbie 1723 10/25/18 11:58 http://php.net/manual/ru/language.oop5.interfaces.php Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 10/25/18 12:09 Сделал вот еще одну функцию, мне таск пишет 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'; } Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 10/25/18 12:34 (изменено) Пока закомментировал этот код, вот такая строка подключения в другом движке: $gHeroStats = $em->getRepository('StatsBundle:StatsHeroes')->find($hero); что вместо find использовать? Попробовал load, не помогает. Изменено 25 октября 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 10/25/18 12:45 (изменено) Так. Посмотрел в движке, может быть, load и нужен. Я так понимаю, нужно добавить таблицу? Хотя нет. У меня в таблице нет ID, поэтому, load не подходит. Изменено 25 октября 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 10/25/18 13:19 Разобрался, потому что таблица пустая. Поделиться сообщением Ссылка на сообщение
newbie 1723 10/25/18 13:27 first() выкидывает исключение, поэтому используйте try/catchtry { $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, ('player_id=1'))->first()); } catch (\UnderflowException $e) { } Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 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 выводить ошибку, что записей в таблице нет? Изменено 25 октября 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 10/25/18 16:01 Правильно ли я сделал? Было: $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); } Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 10/25/18 16:06 (изменено) Ну конечно же ПРАВИЛЬНО, у меня ТЕПЕРЬ всё работает как часики, блин, я так рад, что у меня что-то получаться начало и при этом, я понимаю что делаю. Спасибо вам огромнейшее. Еще хочу спросить на счет try и catch, правильно я понял. Их использовать там, где нет больших условий для if else, например: Если у меня условие if (!hero) использовать try. Если условие if ($hero >= 1) уже использовать if else? Я закончил, гляньте пожалуйста на наличие ошибок, как время будет. Функционал рабочий, все функции выполняет и записывает в БД.heroesScore.php Изменено 25 октября 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
newbie 1723 10/26/18 07:35 Еще хочу спросить на счет try и catch, правильно я понял. Их использовать там, где нет больших условий для if else, например: Если у меня условие if (!hero) использовать try. Если условие if ($hero >= 1) уже использовать if else?Документацию читали? :) Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 10/28/18 09:09 Ничего не понял из документации ((( Поделиться сообщением Ссылка на сообщение
newbie 1723 10/28/18 09:26 Допустим нужно достать 1 запись (таблица постов) из БД с определенной датой$post = \IPS\Db::i()->select('*', 'forums_posts', array('post_date=?', 1422859622))->first();Если запись существует, то мы получим массив с даннымиЕсли записи не существует, то будет выброшено исключение UnderflowException, которое нужно пойматьПоэтому оборачиваем код в try/catchtry{ $post = \IPS\Db::i()->select('*', 'forums_posts', array('post_date=?', 1422859622))->first();}catch (\UnderflowException $e){} Поделиться сообщением Ссылка на сообщение