实现 jqGrid 的 Thrace 数据网格:Doctrine 不会触发查询
Thrace data grid implementing jqGrid: Doctrine does not fire the query
我在 Linux 机器上使用 Symfony、学说 ORM、SQL 服务器。我正尝试在 https://github.com/thrace-project/datagrid-bundle 上实现 Thrace 数据网格。我按原样按照步骤操作。这是我的代码:
index.html.twig
{% extends "::base.html.twig" %}
{% block stylesheets %}
<link rel="stylesheet" type="text/css" media="screen" href="{{ asset('bundles/productorderlookup/css/ui-lightness/jquery-ui.css') }}" />
<link rel="stylesheet" type="text/css" media="screen" href="{{ asset('bundles/productorderlookup/css/ui.jqgrid.css') }}" />
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script src="{{ asset('bundles/productorderlookup/js/init-datagrid.js') }}" type="text/javascript"></script>
<script src="{{ asset('bundles/productorderlookup/js/i18n/grid.locale-en.js') }}" type="text/javascript"></script>
<script src="{{ asset('bundles/productorderlookup/js/jquery.jqGrid.src.js') }}" type="text/javascript"></script>
<script src="{{ asset('bundles/thracedatagrid/js/init-datagrid.js') }}" type="text/javascript"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/i18n/jquery-ui-i18n.min.js"></script>
{% endblock %}
{% block body %}
<div>{{ thrace_datagrid('user_management') }}</div>
{% endblock %}
UserManagementBuilder.php
namespace ProductOrder\UserOrderBundle;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Thrace\DataGridBundle\DataGrid\DataGridFactoryInterface;
class UserManagementBuilder
{
const IDENTIFIER = 'user_management';
protected $factory;
protected $translator;
protected $router;
protected $em;
public function __construct (DataGridFactoryInterface $factory, TranslatorInterface $translator, RouterInterface $router,
EntityManager $em)
{
$this->factory = $factory;
$this->translator = $translator;
$this->router = $router;
$this->em = $em;
}
public function build ()
{
$dataGrid = $this->factory->createDataGrid(self::IDENTIFIER);
$dataGrid
->setCaption($this->translator->trans('user_management_datagrid.caption'))
->setColNames(array(
$this->translator->trans('column.firstName'),
$this->translator->trans('column.lastName'),
$this->translator->trans('column.enabled'),
))
->setColModel(array(
array(
'name' => 'firstName', 'index' => 'u.firstName', 'width' => 200,
'align' => 'left', 'sortable' => true, 'search' => true,
),
array(
'name' => 'lastName', 'index' => 'u.lastName', 'width' => 200,
'align' => 'left', 'sortable' => true, 'search' => true,
),
array(
'name' => 'enabled', 'index' => 'u.enabled', 'width' => 30,
'align' => 'left', 'sortable' => true, 'search' => true,
'formatter' => 'checkbox', 'stype' => 'select',
'searchoptions' => array(
'value' => array(
1 => 'enable',
0 => 'disabled',
)
)
),
))
->setQueryBuilder($this->getQueryBuilder())
->enableSearchButton(true)
;
return $dataGrid;
}
protected function getQueryBuilder()
{
$qb = $this->em->getRepository('ProductOrderUserOrderBundle:User')->createQueryBuilder('u');
$qb
->select('u.id, u.firstName, u.lastName, u.enabled')
->groupBy('u.id')
;
return $qb;
}
}
DefaultController.php
namespace ProductOrder\UserOrderBundle\Controller;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\Config\FileLocator;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Httpfoundation\Request;
class DefaultController extends Controller
{
public function indexAction()
{
/** @var \Thrace\DataGridBundle\DataGrid\DataGridInterface */
$userManagementDataGrid = $this->container->get('thrace_data_grid.provider')->get('user_management');
return $this->render('ProductOrderUserOrderBundle:Default:index.html.twig',array(
'userManagementDataGrid' => $userManagementDataGrid,
));
}
}
实体classUser.php
namespace ProductOrder\UserOrderBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* * @ORM\Table(name="TSOFT_LEARN.dbo.User")
* @ORM\Entity
*/
class User
{
/**
* @var integer
*
* @ORM\Id @ORM\Column(name="id", type="integer")
*
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="firstName", type="string", length=255, nullable=true, unique=false)
*/
protected $firstName;
/**
* @var string
*
* @ORM\Column(name="lastName", type="string", length=255, nullable=true, unique=false)
*/
protected $lastName;
/**
* @var boolean
*
* @ORM\Column(name="enabled", type="boolean")
*/
protected $enabled = false;
public function __construct()
{
}
public function getId()
{
return $this->id;
}
public function setFirstName($firstName)
{
$this->firstName = $firstName;
}
public function getFistName()
{
return $this->firstName;
}
public function setLastName($lastName)
{
$this->lastName = $lastName;
}
public function getLastName()
{
return $this->lastName;
}
public function setEnabled($enabled)
{
$this->enabled = $enabled;
}
public function isEnabled()
{
return $this->enabled;
}
}
页面加载正常,但在 Symfony 工具栏上显示没有触发任何查询。
抱歉,如果我提供了太多代码。
编辑: 打印 getDQL 代码后我得到 SELECT u.id, u.firstName, u.lastName, u FROM AppBundle\UserPoBundle\Entity\User u GROUP BY u.id
但是在我的学说调试中window我仍然没有收到任何询问。
显然在 Doctrine 连接到 SQL 服务器时存在错误。当我将同一个项目连接到 PostgreSQL 服务器时,一切正常。
更新: 该错误与 Doctrine 无关。当我在没有任何数据网格捆绑的情况下将普通 Doctrine 与普通 SQL 连接时,奇怪的别名消失了。但是,如果我使用任何捆绑包,问题仍然存在。
已解决: 我知道这个错误会很简单。当我创建用户实体时,我给的 table 名称是 [TSOFT_LEARN].[dbo].[User]
。 Doctrine 以某种方式采用了该名称并将其转换为“[0_
”,一旦我摆脱了那些“[]
”,一切正常。
我在 Linux 机器上使用 Symfony、学说 ORM、SQL 服务器。我正尝试在 https://github.com/thrace-project/datagrid-bundle 上实现 Thrace 数据网格。我按原样按照步骤操作。这是我的代码: index.html.twig
{% extends "::base.html.twig" %}
{% block stylesheets %}
<link rel="stylesheet" type="text/css" media="screen" href="{{ asset('bundles/productorderlookup/css/ui-lightness/jquery-ui.css') }}" />
<link rel="stylesheet" type="text/css" media="screen" href="{{ asset('bundles/productorderlookup/css/ui.jqgrid.css') }}" />
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script src="{{ asset('bundles/productorderlookup/js/init-datagrid.js') }}" type="text/javascript"></script>
<script src="{{ asset('bundles/productorderlookup/js/i18n/grid.locale-en.js') }}" type="text/javascript"></script>
<script src="{{ asset('bundles/productorderlookup/js/jquery.jqGrid.src.js') }}" type="text/javascript"></script>
<script src="{{ asset('bundles/thracedatagrid/js/init-datagrid.js') }}" type="text/javascript"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/i18n/jquery-ui-i18n.min.js"></script>
{% endblock %}
{% block body %}
<div>{{ thrace_datagrid('user_management') }}</div>
{% endblock %}
UserManagementBuilder.php
namespace ProductOrder\UserOrderBundle;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Thrace\DataGridBundle\DataGrid\DataGridFactoryInterface;
class UserManagementBuilder
{
const IDENTIFIER = 'user_management';
protected $factory;
protected $translator;
protected $router;
protected $em;
public function __construct (DataGridFactoryInterface $factory, TranslatorInterface $translator, RouterInterface $router,
EntityManager $em)
{
$this->factory = $factory;
$this->translator = $translator;
$this->router = $router;
$this->em = $em;
}
public function build ()
{
$dataGrid = $this->factory->createDataGrid(self::IDENTIFIER);
$dataGrid
->setCaption($this->translator->trans('user_management_datagrid.caption'))
->setColNames(array(
$this->translator->trans('column.firstName'),
$this->translator->trans('column.lastName'),
$this->translator->trans('column.enabled'),
))
->setColModel(array(
array(
'name' => 'firstName', 'index' => 'u.firstName', 'width' => 200,
'align' => 'left', 'sortable' => true, 'search' => true,
),
array(
'name' => 'lastName', 'index' => 'u.lastName', 'width' => 200,
'align' => 'left', 'sortable' => true, 'search' => true,
),
array(
'name' => 'enabled', 'index' => 'u.enabled', 'width' => 30,
'align' => 'left', 'sortable' => true, 'search' => true,
'formatter' => 'checkbox', 'stype' => 'select',
'searchoptions' => array(
'value' => array(
1 => 'enable',
0 => 'disabled',
)
)
),
))
->setQueryBuilder($this->getQueryBuilder())
->enableSearchButton(true)
;
return $dataGrid;
}
protected function getQueryBuilder()
{
$qb = $this->em->getRepository('ProductOrderUserOrderBundle:User')->createQueryBuilder('u');
$qb
->select('u.id, u.firstName, u.lastName, u.enabled')
->groupBy('u.id')
;
return $qb;
}
}
DefaultController.php
namespace ProductOrder\UserOrderBundle\Controller;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\Config\FileLocator;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Httpfoundation\Request;
class DefaultController extends Controller
{
public function indexAction()
{
/** @var \Thrace\DataGridBundle\DataGrid\DataGridInterface */
$userManagementDataGrid = $this->container->get('thrace_data_grid.provider')->get('user_management');
return $this->render('ProductOrderUserOrderBundle:Default:index.html.twig',array(
'userManagementDataGrid' => $userManagementDataGrid,
));
}
}
实体classUser.php
namespace ProductOrder\UserOrderBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* * @ORM\Table(name="TSOFT_LEARN.dbo.User")
* @ORM\Entity
*/
class User
{
/**
* @var integer
*
* @ORM\Id @ORM\Column(name="id", type="integer")
*
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="firstName", type="string", length=255, nullable=true, unique=false)
*/
protected $firstName;
/**
* @var string
*
* @ORM\Column(name="lastName", type="string", length=255, nullable=true, unique=false)
*/
protected $lastName;
/**
* @var boolean
*
* @ORM\Column(name="enabled", type="boolean")
*/
protected $enabled = false;
public function __construct()
{
}
public function getId()
{
return $this->id;
}
public function setFirstName($firstName)
{
$this->firstName = $firstName;
}
public function getFistName()
{
return $this->firstName;
}
public function setLastName($lastName)
{
$this->lastName = $lastName;
}
public function getLastName()
{
return $this->lastName;
}
public function setEnabled($enabled)
{
$this->enabled = $enabled;
}
public function isEnabled()
{
return $this->enabled;
}
}
页面加载正常,但在 Symfony 工具栏上显示没有触发任何查询。
抱歉,如果我提供了太多代码。
编辑: 打印 getDQL 代码后我得到 SELECT u.id, u.firstName, u.lastName, u FROM AppBundle\UserPoBundle\Entity\User u GROUP BY u.id
但是在我的学说调试中window我仍然没有收到任何询问。
显然在 Doctrine 连接到 SQL 服务器时存在错误。当我将同一个项目连接到 PostgreSQL 服务器时,一切正常。
更新: 该错误与 Doctrine 无关。当我在没有任何数据网格捆绑的情况下将普通 Doctrine 与普通 SQL 连接时,奇怪的别名消失了。但是,如果我使用任何捆绑包,问题仍然存在。
已解决: 我知道这个错误会很简单。当我创建用户实体时,我给的 table 名称是 [TSOFT_LEARN].[dbo].[User]
。 Doctrine 以某种方式采用了该名称并将其转换为“[0_
”,一旦我摆脱了那些“[]
”,一切正常。