我有一个实体'联系人'它与另一个实体有一个OneToMany关联' Invoice':
// src/AppBundle/Entity/Contact.php
/**
* @var Collection
*
* @ORM\OneToMany(targetEntity="Invoice", mappedBy="contact", cascade={"persist", "remove"}, orphanRemoval=true)
**/
private $invoices;
// src/AppBundle/Entity/Invoice.php
/**
* @var Contacts
*
* @ORM\ManyToOne(targetEntity="Contact", inversedBy="invoices")
* @ORM\JoinColumn(name="id_contact_fk", referencedColumnName="id_contact_pk")
**/
private $contact;
然后我有一个Sonata Admin课程' ContactAdmin'它在编辑视图中显示此关联:
// src/AppBundle/Admin/ContactAdmin.php
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->tab('Invoices')
->with('Invoices')
->add('invoices', 'sonata_type_collection', array(
'btn_add' => false,
'required' => false
), array(
'edit' => 'inline',
'inline' => 'table'
))
->end()
->end();
}
除了一些联系人有数百张发票可以追溯多年之外,这种方法很好。我只需要显示当年的发票。
在Doctrine中映射关联时,看起来没有任何方式可以使用动态值(类似于YEAR(在mysql中为CURDATE())代替连接列。所以看起来似乎我需要做的是以某种方式覆盖Sonata Admin / Doctrine在呈现ContactAdmin编辑视图时使用的查询。
我知道可以覆盖Sonata Admin类中的createQuery()方法,但是(如果我在这里错了,请纠正我)这只是用于生成列表视图的查询。
我可以采取行动的sonata.admin.event.configure.form事件,但我不确定是否有任何方法可以从该上下文修改查询?
我该如何解决这个问题?
答案 0 :(得分:3)
经过一番挖掘后,我发现sonata_type_collection表单类型接受一个名为'data'的未记录参数。您可以直接传递对象集合,并使用它们。
答案 1 :(得分:0)
已接受的解决方案确实允许您将选项限制为查询,但是在保存实体后,不会使用值填充表单字段。
改为使用float: right
选项:
query_builder