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你的属性是正确的,否则你会很头疼......
我有 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你的属性是正确的,否则你会很头疼......