Symfony从MSSQL Server生成实体[导入]

时间:2016-03-04 08:03:42

标签: php sql-server doctrine-orm symfony

  

Update1:​​我在另一个运行mysql的项目上测试了这个 - 我删除了一个实体并尝试通过导入表来“恢复”它,我在那里得到了同样的错误同样。所以这不是一个mssql问题,它必须是配置问题。我错过了什么配置?

     

Update2:当不使用过滤器时,它会全部导入并且不会显示任何错误。过滤器有什么问题?

我正在尝试从现有的mssql数据库生成实体。为此,有关我正在使用的内容的一些信息:

  • microsoft sql server 2012
  • Symfony 2.8 with php7
  • 用于db连接的parameters.yml中的驱动程序:sqlsrv(mssql尚不支持pdo)。 sqlsrv(非pdo)的驱动程序可以下载here,我正在使用线程安全版本。

Config.yml:

# Doctrine Configuration
doctrine:
  dbal:
    driver:   "%database_driver%"
    host:     "%database_host%"
    port:     "%database_port%"
    dbname:   "%database_name%"
    user:     "%database_user%"
    password: "%database_password%"

  orm:
    default_entity_manager: default
    auto_generate_proxy_classes: "%kernel.debug%"
    entity_managers:
      default:
        auto_mapping: true
        naming_strategy: doctrine.orm.naming_strategy.underscore

使用dbal部分中指定的值连接到数据库是可行的,我可以在我的代码中创建一个新实体并运行schema update命令来创建相应的表。另一方面,当尝试使用以下命令从现有表(名为“dbo.tblPlaces”)生成实体时:

php app/console doctrine:mapping:import --force AppBundle xml --filter="tblPlaces"

(我在过滤器中也试过“dbo.tblPlaces”),我一直收到错误:

  

数据库没有任何映射信息。

我已经阅读了几乎所有其他帖子,我在这里可以找到关于上述错误的stackoverflow和symfony的官方文档,但是无法找到解决方案。为什么我一直收到这个烦人的错误信息?该表非常小,仅包含以下字段:

tbl.Places

1 个答案:

答案 0 :(得分:1)

我将把我的两分钱放在这里,并告诉你只有70-80%的必要映射信息基于字段,索引和外键约束。

来自Docs

  

Doctrine能够转换大约70-80%的必要条件   基于字段,索引和外键的映射信息   限制。学说不能发现反向关联,继承   类型,具有外键作为主键或语义的实体   对级联或生命周期事件等关联的操作

一段时间后,我和MsSQL和Symfony面临同样的问题。

我最终得到了另一种解决方案。

我最终得到的是我在MsSQL中创建了一个存储过程,它以记录的形式在SQL服务器中生成实体。然后,您可以将其复制并粘贴到实体文件中,然后您就可以生成工作实体。它对我来说非常有用,也有希望对你有用。

您可以从这里下载https://github.com/dipens/W3_APP_GEN_DOCTRINE.sql/blob/master/W3_APP_GEN_Doctrine

代码在这里:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[W3_APP_GEN_Doctrine] @tablename varchar(255)
AS

WITH D AS (
select data_type + 
    case
        when data_type like '%text' or data_type like 'image' or data_type like 'sql_variant' or data_type like 'xml'
            then ''
        when data_type = 'float'
            then '(' + convert(varchar(10), isnull(numeric_precision, 18)) + ')'
        when data_type = 'numeric' or data_type = 'decimal'
            then '(' + convert(varchar(10), isnull(numeric_precision, 18)) + ',' + convert(varchar(10), isnull(numeric_scale, 0)) + ')'
        when (data_type like '%char' or data_type like '%binary') and character_maximum_length = -1
            then '(max)'
        when character_maximum_length is not null
            then '(' + convert(varchar(10), character_maximum_length) + ')'
        else ''
    end as CONDENSED_TYPE
    , 

    case 
        when data_type like '%text%' or data_type like '%char%' OR data_type ='uniqueidentifier'  OR data_type ='bigint'
            then 'string'
        when data_type ='int' or data_type ='smallint' or data_type ='tinyint'
            then 'integer'
        when data_type ='date'
            then 'datetime'
        when data_type ='bit'
            then 'boolean'
        when data_type ='decimal' 
            then 'string' --'decimal'
        when data_type ='datetime'
            then data_type
        when data_type ='double' OR data_type ='float'
            then 'float'
        when data_type ='money'
            then 'string' --'decimal'
        when data_type ='bigint'
            then 'string'
    end as DoctrineType


    ,object_id(table_name) AS TID ,C.*, SC.is_computed, SC.is_identity
from information_schema.columns C
INNER JOIN sys.columns SC ON object_id(table_name)=SC.object_id and C.COLUMN_NAME=SC.name
where table_name= @tablename

)
SELECT 
'/**' 
+ CHAR(13)+CHAR(10) + '* @var ' + IIF(D.DoctrineType='datetime','\'+D.DoctrineType,D.DoctrineType)
+ CHAR(13)+CHAR(10) + '*'
+ CHAR(13)+CHAR(10) + '* @ORM\Column(name="' + D.COLUMN_NAME + '", type="' + D.DoctrineType + '"' 
    + IIF(D.DoctrineType='string' and D.DATA_TYPE NOT IN ('uniqueidentifier','decimal','money','bigint'),', length=' + convert(varchar(25),D.CHARACTER_MAXIMUM_LENGTH),'')
    + IIF(D.DoctrineType='decimal',', precision=' + convert(varchar(25),D.NUMERIC_PRECISION) + ', scale=' + convert(varchar(25),D.NUMERIC_SCALE),'')
    + IIF(D.IS_NULLABLE='NO' and D.is_identity=0,', nullable=false','')
    + ')'
+ IIF(D.is_identity=1,CHAR(13)+CHAR(10) + '* @ORM\Id','')
+ IIF(D.is_identity=1,CHAR(13)+CHAR(10) + '* @ORM\GeneratedValue(strategy="AUTO")','')
+ CHAR(13)+CHAR(10) + '*/'
+ CHAR(13)+CHAR(10)
+ CHAR(13)+CHAR(10) + 'private $' + D.COLUMN_NAME  +';'
+ CHAR(13)+CHAR(10)

AS DOCTRINE
--,D.ORDINAL_POSITION
FROM D
--ORDER BY D.ORDINAL_POSITION

UNION ALL

SELECT
'/**' 
+ CHAR(13)+CHAR(10) + '* @return ' + IIF(D.DoctrineType='datetime','\'+D.DoctrineType,D.DoctrineType)
+ CHAR(13)+CHAR(10) + '*/'
+ CHAR(13)+CHAR(10) + 'public function get' + replace(D.COLUMN_NAME,'_','') +  '()'
+ CHAR(13)+CHAR(10) + '{'
+ CHAR(13)+CHAR(10) + ' return $this->' + D.COLUMN_NAME + ';'
+ CHAR(13)+CHAR(10) + '}'
+ CHAR(13)+CHAR(10)
+ CHAR(13)+CHAR(10)+ '/**' 
+ CHAR(13)+CHAR(10) + '* @param ' + IIF(D.DoctrineType='datetime','\'+D.DoctrineType,D.DoctrineType) + ' $' + D.COLUMN_NAME
+ CHAR(13)+CHAR(10) + '*/'
+ CHAR(13)+CHAR(10) + 'public function set' + replace(D.COLUMN_NAME,'_','') +  '('+ '$' + D.COLUMN_NAME + ')'
+ CHAR(13)+CHAR(10) + '{'
+ CHAR(13)+CHAR(10) + ' $this->' + D.COLUMN_NAME + '=' + '$' + D.COLUMN_NAME + ';'
+ CHAR(13)+CHAR(10) + '}'
+ CHAR(13)+CHAR(10)

--,D.ORDINAL_POSITION
FROM D