我正在使用SonataAdmin并拥有十几个实体和一个控制器。 CMS的大多数只是将实体字段按原样从数据库显示到我的视图中。我想向我的实体添加一些自定义字段,数据将跨越多个字段(在我的Car实体上,我想查询驱动程序和许可证实体。)
以下是我的汽车和司机实体的示例:
<?php
namespace Scholar\AdminBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Car
*
* @ORM\Table(name="Car", indexes={@ORM\Index(name="id", columns={"id"})})
* @ORM\Entity
*/
class Car
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var int
*
* @ORM\Column(name="driverId", type="integer", nullable=false)
*/
private $driverId;
// ...
}
use Doctrine\ORM\Mapping as ORM;
/**
* Driver
*
* @ORM\Table(name="Driver", indexes={@ORM\Index(name="id", columns={"id"})})
* @ORM\Entity
*/
class Driver
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="firstName", type="string", nullable=false)
*/
private $firstName;
// ...
}
以及如何添加要为每个实体显示的字段(通过扩展Admin):
<?php
namespace Scholar\AdminBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\AdminBundle\Show\ShowMapper;
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
。)我显然必须查询汽车和司机实体(和其他一些。)我的问题是,要将此自定义字段添加到汽车实体,哪里是最好的地方将查询的方法放在多个实体上,然后如何将其添加到我的dataFilters中,并让我可以在$listMapper
这样我就可以执行类似的操作,在Car管理页面上显示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')
// ...
}
谢谢!
答案 0 :(得分:0)
我的第一个方法是让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;
与相应的吸气剂。吸气剂应如下所示:
public function getNumberOfDrivers()
{
$this->drivers->count();
}
您现在应该可以使用'numberOfDrivers',如上所述。