将MS SQL与Symfony 3一起使用

lev*_*nth 6 php sql-server-2008 symfony doctrine-orm

您好,我需要一些Symfony 3和MS SQL Server的帮助:

我正在使用Symfony 3并希望连接到MS SQL Server,我做了一些研究,发现默认情况下不支持它,但有一些Bundles可供使用.

在尝试了其中一些之后,我找到了一个部分为我工作的Bundle(realestateconz/mssql-bundle)但每次我尝试查询数据库时都会收到错误消息(我将其格式化为更具可读性):

Uncaught PHP Exception Doctrine\DBAL\DBALException: An exception occurred while executing 
'SELECT 
  t0.id AS id_1, 
  t0.username AS username_2
FROM user t0 
WHERE t0.username = ?' with params ["testusername"]:

SQLSTATE[HY000]: General error: 156 General SQL Server error:
Check messages from the SQL Server [156] (severity 15) [(null)]
Run Code Online (Sandbox Code Playgroud)

代码行看起来像这样

$user = $em->getRepository('AppBundle:User')->findBy(array('username' => $username)); 
Run Code Online (Sandbox Code Playgroud)

我的学说和symfony设置如下所示:

#config.yml
doctrine:
    dbal:
        driver_class: Realestate\MssqlBundle\Driver\PDODblib\Driver
        host:     "%database_host%"
        #port:    "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        #charset:  UTF8

#parameters.yml
parameters:
    database_host: myserver
    database_name: database     #without schema
    database_user: user
    database_password: pw
Run Code Online (Sandbox Code Playgroud)

config.yml中的Port和Charset被注释掉了,因为我在stackoverflow上发现了一些关于在定义端口和字符集时使用MySQL的教义(虽然不记得确切位置).在parameters.yml中我无法添加DB的架构(表"User"的完整路径是database.web.[User])因为它将在另一个Error中运行.

Web服务器使用apache2,php5.6(包括php5-sybase包)运行Ubuntu 16.04,我使用freetds连接到MSSQL-Server(手动连接工程).

这是我的FreeTDS设置:

[MYSERVER]
host = myserveradress
port = 1433
tds version = 8.0
client charset = UTF-8
text size = 20971520
Run Code Online (Sandbox Code Playgroud)

据我所知,Doctrine从单行代码生成错误的SQL查询(MySQL-Syntax而不是MSSQL-Syntax),那么我该怎么办呢?或者是否有另一种方法可以在Linux上使用Symfony 3成功连接和查询MSSQL-Server?

小智 3

我自己找到了解决方案,您需要在 SQL-Server 使用的语法中为 Doctrine 提供实体的确切表名称。

对于 Symfony 使用的注释格式,它看起来像这样:

/** Annotation for your Classfile
 * ExampleClass
 * 
 * @ORM\Table(name="[ExampleClass]") <-- Square Brackets for MSSQL
 * @ORM\Entity
 */
Run Code Online (Sandbox Code Playgroud)

将表名更改为 MSSQL 格式后,一切都按预期进行。