2013-12-19 2 views
1

У меня возникли некоторые проблемы с извлечения данных из схемы базы данных и отображения его в сетке, это схема SQL я использую: enter image description hereМедленные данные, показывающие в рейтингах

Вид:

{% extends 'MyBundle:Default:index.html.twig' %} 
{% block body %} 

    <table class="table table-striped table-bordered"> 
     <tr> 
      <th>Player name</th> 
      {% for action in actions %} 
       <th>{{ action.displayName }}</th> 
      {% endfor %} 
     </tr> 
     {% for stat in stats %} 
      <tr> 
       <td>{{ stat.playername }}</td> 
       {% for key, action in actions %} 

        {% for key2, a in stat.actions|group('id', stat.id) if (key2 == (key + 1)) %} 
         <td>{{ a|length }}</td> 
        {% else %} 
         <td>0</td> 
        {% endfor %} 

       {% endfor %} 

      </tr> 
     {% else %} 
      <p>No statistics have been found</p> 
     {% endfor %} 
    </table> 
{% endblock %} 

групповая функция используется для группировки данных для пользователя, это функция, которую я написал: namespace MyName \ MyBundle \ Twig;

class GroupExtension extends \Twig_Extension 
{ 
    public function getFilters() 
    { 
     return array(
      new \Twig_SimpleFilter('group', array($this, 'arrayGroup')), 
     ); 
    } 


    public function arrayGroup($array, $element, $playerid) 
    { 
     $outputArr = array(); 

     foreach($array as $key => $value) 
     { 
      if($value->getPlayer()->getId() == $playerid) 
      { 
       $outputArr[$value->getAction()->getId()][] = $value; 
      } 
     } 

     return $outputArr; 
    } 
    /** 
    * {inheritDoc} 
    */ 
    public function getName() 
    { 
     return 'group_extension'; 
    } 
} 

Все работает и такое, но он загружает очень медленно (я заполнял таблицы с фиктивными записями) Я думаю, это потому, что я сделал oneToMany отношения в игроке сущности легко группы все. Я просто не знаю никаких других возможностей.

Это тот игрок, Entity

use Doctrine\ORM\Mapping as ORM; 

/** 
* Player 
* 
* @ORM\Table(name="player") 
* @ORM\Entity 
*/ 
class Player 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="NONE") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="playerName", type="string", length=17) 
    */ 
    private $playerName; 

    /** 
    * @var PlayerAction[] 
    * 
    * @ORM\OneToMany(targetEntity="PlayerAction", mappedBy="player") 
    */ 
    private $actions; 


    /** 
    * Set id 
    * 
    * @param integer $id 
    * @return Player 
    */ 
    public function setId($id) 
    { 
     $this->id = $id; 

     return $this; 
    } 

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

    /** 
    * Set playerName 
    * 
    * @param string $playerName 
    * @return Player 
    */ 
    public function setPlayerName($playerName) 
    { 
     $this->playerName = $playerName; 

     return $this; 
    } 

    /** 
    * Get playerName 
    * 
    * @return string 
    */ 
    public function getPlayerName() 
    { 
     return $this->playerName; 
    } 

    /** 
    * @param mixed $actions 
    */ 
    public function setActions($actions) 
    { 
     $this->actions = $actions; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getActions() 
    { 
     return $this->actions; 
    } 
} 

ответ

0

Я установил его, это запрос я уверен, выполнение:

$queryActions = $em->createQuery(
    "SELECT a.actionName, a.id, a.displayName 
    FROM MyBundle:Action a"); 

$actions = $queryActions->getResult(); 
$query = $em->createQuery(
    "SELECT p.playerName, a.actionName, SUM(a) as amount 
    FROM MyBundle:Player p 
    LEFT JOIN p.actions pa 
    INNER JOIN pa.action a 
    GROUP BY pa.action, p 
    ORDER BY p.playerName ASC 
    " 
); 

$result = $query->getResult(); 

, который дал мне ResultSet, где я мог бы работать, я просто manipulized его, чтобы он мог дать мне хороший обзор и хорошую ResultSet работать с на шаблоне веточки

$stats = array(); 
foreach($result as $record) 
{ 
    $stats[$record["playerName"]][] = $record; 
} 


$uarray = array(); 

foreach($stats as $playerstat) 
{ 
    # set all actions to 0 first, this way we prevent non sync stats 
    foreach($actions as $action) 
    { 
     $uarray[$playerstat[0]['playerName']][$action['actionName']] = 0; 
    } 

    # now set it's good stats 
    foreach($playerstat as $actionstat) 
    { 

     //$uarray[$actionstat['playerName']]["playerName"] = $actionstat['playerName']; 

     $uarray[$actionstat['playerName']][$actionstat['actionName']] = $actionstat['amount']; 
    } 
} 

$data['stats'] = $uarray; 
$data['actions'] = $actions; 

Я надеюсь, что это может быть полезным для кого-то :)

0

Все работает означает, что ваш код правильно. Возможно, вам нужно проверить структуру вашего стола, вы можете запустить команду:

mysqldump -d your_database_name 

и поделитесь выходом здесь.

+0

код работает он Justs занимает много времени, чтобы показать на экране, и я хотите ускорить его, используя возможный лучший способ, потому что у меня плохой код. Думаю –

+0

Используйте панель инструментов отладки Symfony2 (в dev environement), чтобы узнать, сколько времени занимает каждый запрос. –

Смежные вопросы