在哪里向实体添加自定义字段?

时间:2015-07-05 05:50:50

标签: symfony sonata-admin sonata

我正在使用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')
        // ...
    }

谢谢!

1 个答案:

答案 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',如上所述。