如何将查询分隔到另一个类/文件?

时间:2019-02-14 07:46:39

标签: php symfony

我为我的一个数据表创建了一个单独的类(让我们说MyTableType)。在ORMAdapter内部,我创建了一个自定义查询,该查询相当长且复杂。这就是为什么我想将其与负责创建表本身的代码分开并将其移至其他类(例如MyTableQuery)中的原因。

我正在使用Symfony 4.2和omines / datatables-bundle捆绑包。

该查询类应返回什么?那么在MyTableType中获取返回查询的最佳方法是什么?

class MyTableType implements DataTableTypeInterface
{
    public function configure(DataTable $dataTable, array $options)
    {
        $request = $options['request'];

        $dataTable
            ->add('id',
                NumberColumn::class,
                array(
                    'label' => 'ID',
                    'globalSearchable' => false
                )
            )

Some more columns

->createAdapter(ORMAdapter::class,
                array(
                    'entity' => MyEntity::class,
                    'query' => function (QueryBuilder $builder) use ($request)
                    { 
                        //Long query I'd prefer to get from somewhere else
                    }
                )
            )
        ;
    }
}

在我的query选项中,我想从该自定义类MyTypeQuery获得回报。这会使MyTableType类更加整洁。最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

好吧,我不知道这是否是最好的解决方案,但我要做的是:

* Pass Doctrine Manager to Table Building class

* Inside my query option pass $builder into repository and build a query on top passed variable.
  And it works.
class MyTableType implements DataTableTypeInterface
{
    public function configure(DataTable $dataTable, array $options)
    {
        $request = $options['request'];
        $em = $options['entityManager'];

        $dataTable
            ->add('id',
                NumberColumn::class,
                array(
                    'label' => 'ID',
                    'globalSearchable' => false
                )
            )

... Some more columns ...

->createAdapter(ORMAdapter::class,
                array(
                    'entity' => MyEntity::class,
                    'query' => function (QueryBuilder $builder) use ($request, $em)
                    { $em->getRepository(MyClass::class)->find($request, $builder) }
                )
            )
        ;
    }
}

在我的存储库中,我返回了传递的QueryBuilder变量,仅此而已。