我使用SonataAdmin,有十几个实体和一个控制器。大多数CMS只是将数据库中的实体字段显示到我的视图中。我想向我的实体添加一些自定义字段,从中数据将跨越多个字段(这意味着在我的汽车实体上,我也想查询驾驶员和执照实体。(
以下是我的汽车和驾驶员实体的示例:
<?php
namespace ScholarAdminBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Car
*
* @ORMTable(name="Car", indexes={@ORMIndex(name="id", columns={"id"})})
* @ORMEntity
*/
class Car
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer", nullable=false)
* @ORMId
* @ORMGeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var int
*
* @ORMColumn(name="driverId", type="integer", nullable=false)
*/
private $driverId;
// ...
}
use DoctrineORMMapping as ORM;
/**
* Driver
*
* @ORMTable(name="Driver", indexes={@ORMIndex(name="id", columns={"id"})})
* @ORMEntity
*/
class Driver
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer", nullable=false)
* @ORMId
* @ORMGeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORMColumn(name="firstName", type="string", nullable=false)
*/
private $firstName;
// ...
}
以及我如何添加要为每个实体显示的字段(通过扩展Admin(:
<?php
namespace ScholarAdminBundleAdmin;
use SonataAdminBundleAdminAdmin;
use SonataAdminBundleDatagridDatagridMapper;
use SonataAdminBundleDatagridListMapper;
use SonataAdminBundleFormFormMapper;
use SonataAdminBundleRouteRouteCollection;
use SonataAdminBundleShowShowMapper;
class CarAdmin extends Admin
{
protected function configureRoutes(RouteCollection $collection)
{
$collection->add('sync');
$collection->remove('create');
$collection->remove('delete');
}
/**
* @param DatagridMapper $datagridMapper
*/
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('firstName');
}
/**
* @param ListMapper $listMapper
*/
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('id')
->addIdentifier('firstName')
// ...
}
我想向Car实体添加一个numberOfDrivers
字段。我有查询工作(使用queryBuilder
。(我显然必须查询Car和Driver实体(以及其他一些实体(。我的问题是,要将这个自定义字段添加到Car实体,在多个实体之间进行查询的方法最好放在哪里,然后我如何将其添加到我的数据过滤器中,并使其在$listMapper
中可访问
这样我就可以这样做,在汽车管理页面上显示numberOfDrivers
,并允许它进行排序:
/**
* @param DatagridMapper $datagridMapper
*/
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('firstName');
->add('numberOfDrivers');
}
/**
* @param ListMapper $listMapper
*/
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('id')
->addIdentifier('firstName')
->addIdentifier('numberOfDrivers')
// ...
}
谢谢!
我的第一种方法是让ORM来完成工作。如果我理解正确的话,一辆车可以有多个司机,一个司机可以开多辆车。所以你有一个标准的多对多关系。
因此,在您的Car orm元数据中定义(例如Car.orm.xml(:
<many-to-many field="drivers" target-entity="Driver">
<join-table name="car2driver">
<join-columns>
<join-column name="driver_id" referenced-column-name="id" />
</join-columns>
<inverse-join-columns>
<join-column name="car_id" referenced-column-name="id" />
</inverse-join-columns>
</join-table>
</many-to-many>
在Car实体的构造函数中,您初始化:
private $drivers;
public function __construct()
{
$this->drivers = new ArrayCollection();
}
添加新字段
private $numberOfDrivers;
具有相应的吸气剂。getter应该是这样的:
public function getNumberOfDrivers()
{
$this->drivers->count();
}
您现在应该能够使用如上所述的"numberOfDrivers"。