Symfony Sonata OneToMany,字段的 Sum 或 Total 未显示在 Admin List 中

Symfony Sonata OneToMany, Sum or Total of a field is not showing in the Admin List

我有 2 个实体,Client 和 Campaign。

Client Entity

/**
 * @ORM\OneToMany(targetEntity="Campaign", mappedBy="client")
 */
protected $campaign;

++++++++++++++++++++++++++++++

Campaign Entity

/**
 * @var integer
 *
 * @ORM\Column(name="numberOfBid", type="integer", nullable=true)
 */
protected $numberOfBid;

/**
 * @ORM\ManyToOne(targetEntity="Clients", inversedBy="campaign")
 * @ORM\JoinColumn(name="client_id", referencedColumnName="client_id")
 */
protected $client;

/* Let's say 
Client A has Campaign A, numberOfBid = 1
Client A has Campaign B, numberOfBid = 5
Client A has Campaign C, numberOfBid = 3
Client A has Campaign D, numberOfBid = 4
                Total numberofBid =    13   
 */

问题:如何获取所有 numberOfBid 的总和并将其显示为客户管理列表板中的 1 列?在方法 configureListFields 上,我尝试了不同的方法,例如使用 sonata_type_model、doctrine_orm_callback 查询,但仍然没有用。

Client ID |  Campaign TotalBid
   A      |       13  

希望得到您的反馈。

提前致谢。

首先你应该重命名你的

protected $campaign;

protected $campaigns;

因为它是一个集合。一位客户有很多活动。

针对您的问题:您可以在您的客户端实体上实现类似这样的方法

class Client{
...
    public function getTotalNumberOfBids() {
        $i = 0;
        foreach ($this->getCampaigns() as $campaign) {
            $i +=  $campaign->getNumberOfBid();
        }
        return $i;
    }
...
}

并通过

添加到您的列表视图
protected function configureListFields(ListMapper $list)
{
    $list
    ...
    ->add('totalNumberOfBids');
}

"magic getter" 将自动调用 getTotalNumberOfBids 方法。

注意:根据 campaigns 集合持有的对象数量,由于使用了 foreach 循环,numberOfBids 的总和可能会很慢。

symfony 中有一些约定可以在这里找到 http://symfony.com/doc/2.8/contributing/code/conventions.html ... 所以如果你想从你的实体访问一个 属性 并且你不能通过调用它来显式地获得它前导关键字,如 "get" 或 "is",symfony(或可能是底层框架)自动尝试查找以 "get" 或 "has" 等开头的方法......这是舒适,因为您不必在属性之前编写 get、set、has 等来调用获取和设置方法。 棘手的是,如果找不到 属性,奏鸣曲管理包不会在列表视图中给你一个错误。例如 totalnumberOfBids 将使您的列为空而不会出现任何错误,因为您不匹配 "number" 部分的驼峰式大小写。所以你应该知道naming/calling你的属性是正确的,否则你会很头疼......