У меня возникли проблемы с извлечением данных из схемы базы данных и отображением их в сетке, это схема 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;
}
}
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;
Надеюсь, это может быть кому-то полезно :)
Все работает означает, что ваш код правильный. Возможно, вам нужно проверить структуру своей таблицы, вы можете запустить команду:
mysqldump -d your_database_name
И поделитесь выводом здесь.
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.