У меня возникли проблемы с извлечением данных из схемы базы данных и отображением их в сетке, это схема sql, которую я использую: введите описание изображения здесь

Вид:

{% 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 %}

Групповая функция используется для группировки данных для каждого пользователя, это функция, которую я написал: пространство имен 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 в сущности игрока, чтобы легко группировать все. Я просто не знаю других возможностей.

Это сущность игрока

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;
    }
}
1
Maxim 19 Дек 2013 в 18:09

2 ответа

Лучший ответ

Я исправил это, это запрос, который я выполняю:

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

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

$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
Maxim 19 Дек 2013 в 16:47

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

mysqldump -d your_database_name 

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

0
jwzhao 19 Дек 2013 в 15:16