从EntityManager过滤要由Doctrine映射的表(不带命令行)

时间:2014-07-17 12:09:57

标签: php codeigniter doctrine-orm doctrine

我在我的应用程序上开发了一个功能,它包括映射和自动生成实体。

问题是用户可以将表格挂起来映射,这就是为什么我必须为要转换的表的名称插入过滤器。要在命令行中执行此操作,我只需要插入参数--filter:

php doctrine orm:convert-mapping --from-database --force --filter='class_name' xml /path_to_app/entities/metadata

然而,我在PHP中开发下面的功能,以获得可能错误的返回。此函数将数据库上的所有表映射到XML,然后从映射中创建实体。与此同时,我不知道如何通过Doctrine PHP库按名称过滤表格,换句话说,如何使用参数--filter =' class_name'。

public function mapearTabelasValidar() {

        //Inicializa variáveis
        $dirBin = DIR_THIRD_PARTY . 'composer/vendor/bin/';
        $dirEntidades = DIR_MODELS . 'entidades/';
        $dirMetadados = $dirEntidades . 'metadados/';
        $title = 'Modelos gerados com sucesso!';

        try {

            //Inicializa o Doctrine e a configuração do EntityManager
            $doctrine = new Doctrine();
            $em = $doctrine->em;
            $em->getConfiguration()->setMetadataDriverImpl(
                    new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
                    $em->getConnection()->getSchemaManager()
                    )
            );

            //Define os metadados 
            $cmf = new \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory();
            $cmf->setEntityManager($em);
            $metadata = $cmf;

            /**
             * Exporta os metadados das entidades em format xml
             * 
             * Comando similar:
             * php doctrine orm:convert-mapping --from-database --force xml /var/www/fwsibe/sistema/models/entidades/metadados
             */
            //echo "<pre>";
            //print_r($metadata);
            //die();
            $cme = new \Doctrine\ORM\Tools\Export\ClassMetadataExporter();
            $exporter = $cme->getExporter('xml', $dirMetadados);
            $exporter->setMetadata($metadata->getAllMetadata());
            $exporter->export();

            /**
             * Gera as entidades a partir do mapeamento XML gerado anteriormente
             * 
             * Comando similar:
             * php doctrine orm:generate:entities --generate-methods=1 --update-entities=1 /var/www/fwsibe/sistema/models/entidades
             */
            $generator = new \Doctrine\ORM\Tools\EntityGenerator();
            $generator->setGenerateStubMethods(true);
            $generator->setRegenerateEntityIfExists(false);
            $generator->generate($metadata->getAllMetadata(), $dirEntidades);

            //Trata a possível exeção
        } catch (Exception $exc) {
            mensagemExcecao($exc, "Falha ao mapear tabelas!", true);
        }
    }

谢谢!

1 个答案:

答案 0 :(得分:2)

使用Doctrine 2.4,当您调用doctrine orm:convert-mapping --from-database --filter时,请注意过滤器是使用PHP中的函数strpos完成的。过滤器的行为类似于搜索&#34; table%&#34;,因此会找到以该字符串过滤的任何实体。

您可以覆盖或更改构建搜索更好过滤器的方法。这描述了如何做到:doctrine mapping

Doctrine 2.5的MetadataFilter :: accept()已更新为使用preg_match()而不是strpos()