TemKa_SD Posted October 25, 2018 Share Posted October 25, 2018 Здравствуйте. Имею вот такой файлик с другого движка, это 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 More sharing options...
newbie Posted October 25, 2018 Share Posted October 25, 2018 http://php.net/manual/ru/language.oop5.interfaces.php Link to comment Share on other sites More sharing options...
TemKa_SD Posted October 25, 2018 Author Share Posted October 25, 2018 Сделал вот еще одну функцию, мне таск пишет 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 More sharing options...
TemKa_SD Posted October 25, 2018 Author Share Posted October 25, 2018 (edited) Пока закомментировал этот код, вот такая строка подключения в другом движке: $gHeroStats = $em->getRepository('StatsBundle:StatsHeroes')->find($hero); что вместо find использовать? Попробовал load, не помогает. Edited October 25, 2018 by TemKa_SD Link to comment Share on other sites More sharing options...
TemKa_SD Posted October 25, 2018 Author Share Posted October 25, 2018 (edited) Так. Посмотрел в движке, может быть, load и нужен. Я так понимаю, нужно добавить таблицу? Хотя нет. У меня в таблице нет ID, поэтому, load не подходит. Edited October 25, 2018 by TemKa_SD Link to comment Share on other sites More sharing options...
TemKa_SD Posted October 25, 2018 Author Share Posted October 25, 2018 Разобрался, потому что таблица пустая. Link to comment Share on other sites More sharing options...
newbie Posted October 25, 2018 Share Posted October 25, 2018 first() выкидывает исключение, поэтому используйте try/catchtry { $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 More sharing options...
TemKa_SD Posted October 25, 2018 Author Share Posted October 25, 2018 (edited) Пока так: 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 October 25, 2018 by TemKa_SD Link to comment Share on other sites More sharing options...
TemKa_SD Posted October 25, 2018 Author Share Posted October 25, 2018 Правильно ли я сделал? Было: $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 More sharing options...
TemKa_SD Posted October 25, 2018 Author Share Posted October 25, 2018 (edited) Ну конечно же ПРАВИЛЬНО, у меня ТЕПЕРЬ всё работает как часики, блин, я так рад, что у меня что-то получаться начало и при этом, я понимаю что делаю. Спасибо вам огромнейшее. Еще хочу спросить на счет try и catch, правильно я понял. Их использовать там, где нет больших условий для if else, например: Если у меня условие if (!hero) использовать try. Если условие if ($hero >= 1) уже использовать if else? Я закончил, гляньте пожалуйста на наличие ошибок, как время будет. Функционал рабочий, все функции выполняет и записывает в БД.heroesScore.php Edited October 25, 2018 by TemKa_SD Link to comment Share on other sites More sharing options...
newbie Posted October 26, 2018 Share Posted October 26, 2018 Еще хочу спросить на счет try и catch, правильно я понял. Их использовать там, где нет больших условий для if else, например: Если у меня условие if (!hero) использовать try. Если условие if ($hero >= 1) уже использовать if else?Документацию читали? :) Link to comment Share on other sites More sharing options...
TemKa_SD Posted October 26, 2018 Author Share Posted October 26, 2018 Не читал, обязательно почитаю ) Link to comment Share on other sites More sharing options...
TemKa_SD Posted October 28, 2018 Author Share Posted October 28, 2018 Ничего не понял из документации ((( Link to comment Share on other sites More sharing options...
newbie Posted October 28, 2018 Share Posted October 28, 2018 Допустим нужно достать 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){} Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now