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



我使用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"。

相关内容

  • 没有找到相关文章

最新更新