如何在Sonata Admin编辑视图中自定义实体关联的SQL查询

时间:2015-08-03 00:46:10

标签: symfony doctrine-orm sonata-admin symfony-sonata sonata

我有一个实体'联系人'它与另一个实体有一个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事件,但我不确定是否有任何方法可以从该上下文修改查询?

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

经过一番挖掘后,我发现sonata_type_collection表单类型接受一个名为'data'的未记录参数。您可以直接传递对象集合,并使用它们。

答案 1 :(得分:0)

已接受的解决方案确实允许您将选项限制为查询,但是在保存实体后,不会使用值填充表单字段。

改为使用float: right选项:

query_builder