我已经坚持了一段时间了:
在我的Symfony应用程序中,我想从数据库中检索一些数据并使用它构建Google Chart。但在我看来,我无法以所需的格式生成JSON数据。
在第一步中,我想复制这个example provided by Google,但是有一些(非常基本的)我自己的数据。 (我想显示“制造商和物品数量而不是浇头和切片”)。
以下是我在TWIG模板中生成图表的代码:
<script type="text/javascript">
// Load the Visualization API and the piechart package.
google.load('visualization', '1.0', {'packages':['corechart']});
// Set a callback to run when the Google Visualization API is loaded.
google.setOnLoadCallback(drawChart);
// Callback that creates and populates a data table,
// instantiates the pie chart, passes in the data and
// draws it.
function drawChart() {
/* var jsonData = $.ajax({
url: "{{ path('my_data_collector_service') }}",
dataType:"json",
async: false
}).responseText;*/
// Create the data table.
var data = new google.visualization.DataTable();
data.addColumn('string', 'Provider');
data.addColumn('number', 'Items');
data.addRows({{ jsonData|raw }});
// Set chart options
var options = {'title':'Products by Provider',
'width':400,
'height':300};
// Instantiate and draw our chart, passing in some options.
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
这是JSON数据在生成页面的源代码中的样子:
data.addRows([{"name":"Apple","items":"2"},{"name":"LG Electronics","items":"1"}]);
与原始代码示例相比,我似乎有一个关联数组结构,以及围绕我所有元素名称和值的很多引号。
我需要更改哪些内容才能使Google Chart API能够处理我的数据?生成此类数据的最佳做法有哪些?
这是我用来生成JSON数据以供参考的代码:
class DataCollectorController extends Controller
{
protected $entityManager;
public function __construct($entityManager) {
$this->entityManager = $entityManager;
}
public function productsAction()
{
$encoders = array(new JsonEncoder());
$normalizers = array(new GetSetMethodNormalizer());
$serializer = new Serializer($normalizers, $encoders);
$em = $this->entityManager;
$query = $em->createQuery(
'SELECT prov.name, count(prod.id) as items
FROM MyBundle:Product prod
JOIN prod.provider prov
GROUP BY prov.name'
);
$data = $serializer->serialize($query->getResult(), 'json');
$response = new Response();
$response->setContent($data);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
}
答案 0 :(得分:0)
所以我通过将这一点添加到我的Data CollectorController来完成工作:
$res = $query->getResult();
foreach ($res as $val)
{
$data[] = array($val['name'], (int) $val['items']);
}
这几乎也可以通过简单地运行
来实现foreach ($res as $val)
{
$data[] = array_values($val);
}
但是这样就有一个问题,那就是数字值仍然用引号括起来。
全班现在看起来像这样:
class DataCollectorController extends Controller
{
protected $entityManager;
public function __construct($entityManager) {
$this->entityManager = $entityManager;
}
public function productsAction()
{
$encoders = array(new JsonEncoder());
$normalizers = array(new GetSetMethodNormalizer());
$serializer = new Serializer($normalizers, $encoders);
$em = $this->entityManager;
$query = $em->createQuery(
'SELECT prov.name, count(prod.id) as items
FROM VSJourneyroWebBundle:Product prod
JOIN prod.provider prov
GROUP BY prov.name'
);
$res = $query->getResult();
foreach ($res as $val)
{
$data[] = array($val['name'], (int) $val['items']);
}
$data = $serializer->serialize($data, 'json');
$response = new Response();
$response->setContent($data);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
}
它正在工作,但它并不真正感觉“优雅”迭代结果对象的每一位。特别是关于铸造'物品'价值的一点点。 仍欢迎任何进一步改进的建议。