【问题标题】:Symfony generate entities from MSSQL Server [Import]Symfony 从 SQL Server 生成实体 [导入]
【发布时间】:2016-03-04 08:03:42
【问题描述】:

更新 1: 我已经在另一个使用 mysql 运行的项目上对此进行了测试 - 我删除了一个实体并尝试通过导入表来“恢复”它,我在那里遇到了同样的错误也是。所以这不是mssql问题,一定是config问题。我错过了什么配置?

更新2:当不使用过滤器时,它正在导入所有并且不显示错误。过滤器有什么问题?

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

  • 微软 sql server 2012
  • 带有 php7 的 Symfony 2.8
  • parameters.yml 中用于 db 连接的驱动程序: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 部分中指定的值连接到数据库正在工作,我可以在我的代码中创建一个新实体并运行模式更新命令来创建相应的表。另一方面,当尝试从名为“dbo.tblPlaces”的现有表中生成实体时,使用以下命令:

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

(我也在过滤器中尝试了“dbo.tblPlaces”),我不断收到错误:

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

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

【问题讨论】:

    标签: php sql-server doctrine-orm symfony


    【解决方案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
    

    【讨论】:

    • 哇,非常感谢 :) 我要试一试。对于其他有相同问题的人:在指定要导入的表的名称时,在其他情况下需要编写名称,例如表 dbo.tblPlaces 必须是“Tblplaces”。如果没有,它甚至不会为您生成 70/80%,而是甚至找不到表格
    • 欢迎您。哦,我也遇到过同样的问题。我用[dbo].[tableName]。我挣扎了几天,发现了问题。我什至 posted 不久前提出了一个关于此的问题。
    • 是的,当涉及到命名时,学说和 mssql 可能会崩溃,我也尝试了几个小时来定位问题,直到我有了“愚蠢”的想法,只是在表名称上玩了一下 ^^
    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多