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,提问作者Кирилл Мещеряков
相关产品推荐
相关产品推荐

