You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony 3.4.8+SonataAdminBundle列表页SQL语法错误求助

解决Symfony 3.4.8 + SonataAdminBundle的SQL语法错误问题

嘿,这个问题我太熟了!你碰到的是MySQL保留关键字的坑——Order是MySQL里的保留字(用来写ORDER BY排序语句的),当Doctrine把你的Order实体转换成SQL查询时,直接写FROM Order o0_会被MySQL当成语法错误,它以为你要写排序操作,根本没认出这是表名。

给你两个靠谱的解决方案,选一个适合你的就行:

方案一:给实体指定非保留字的表名(推荐)

打开你的Entity\Order.php文件,在实体类的注解里修改@ORM\Table的name属性,换成比如orders这种不会冲突的名字:

<?php
namespace Gobusgo\Gobus...;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="orders") // 把表名改成orders,避开保留字
 */
class Order
{
    // 你的实体属性、getter/setter等代码
}

改完之后,执行Doctrine的schema更新命令,让数据库同步这个修改:

php bin/console doctrine:schema:update --force

这样SonataAdmin在生成列表查询时,就会用orders作为表名,不会触发保留字冲突了。

方案二:用反引号包裹保留字表名(不推荐,可读性差)

如果你不想修改表名,可以在注解里给表名加上反引号,告诉MySQL这是一个表名而非关键字:

/**
 * @ORM\Entity
 * @ORM\Table(name="`Order`") // 用反引号把Order包起来
 */
class Order
{
    // 你的实体代码
}

同样执行上面的schema更新命令,就能解决语法错误。不过这种写法不够直观,后续维护容易踩坑,还是更推荐方案一。

只要解决了Doctrine层面的表名冲突问题,SonataAdmin的数据表列表就能正常加载啦!

内容的提问来源于stack exchange,提问作者Кирилл Мещеряков

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:27:14