Php MySQL上具有特殊字符列的Doctrine findBy()

Php MySQL上具有特殊字符列的Doctrine findBy(),php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我有一个MySQL表,其简短描述如下 +-----------------------------------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------------------------+------

我有一个MySQL表,其简短描述如下

+-----------------------------------+---------------+------+-----+---------+----------------+
| Field                             | Type          | Null | Key | Default | Extra          |
+-----------------------------------+---------------+------+-----+---------+----------------+
| id                                | bigint(20)    | NO   | PRI | NULL    | auto_increment |
| trailer_number                    | varchar(20)   | YES  | MUL | NULL    |                |
| discount_structure (%)            | decimal(10,2) | NO   |     | NULL    |                |
| net_purchase_price                | decimal(10,2) | NO   |     | NULL    |                |
| capitalised_extras                | decimal(10,2) | NO   |     | NULL    |                |
| maximum_write-off_period (Months) | int(11)       | NO   |     | NULL    |                |
| maximum_write-off_period (KMS)    | int(11)       | NO   |     | NULL    |                |
| residual_value (%)                | decimal(10,2) | NO   |     | NULL    |                |
| interest_rate (%)                 | decimal(10,2) | NO   |     | NULL    |                |
| insurance (%)                     | decimal(10,2) | NO   |     | NULL    |                |
| coastal_wholesale_price_of_fuel   | decimal(10,2) | NO   |     | NULL    |                |
+-----------------------------------+---------------+------+-----+---------+----------------+
为了处理列名中的
(%)
等,我必须在SQL调用中使用反勾号

SELECT 
    t0.trailer_number AS trailer_number_1, 
    t0.`discount_structure (%)` AS discount_structure_68, 
    t0.net_purchase_price AS net_purchase_price_69, 
    t0.capitalised_extras AS capitalised_extras_70, 
    t0.`maximum_write-off_period (Months)` AS maximum_writeoff_periodMonths_71, 
    t0.`maximum_write-off_period (KMS)` AS maximum_writeoff_periodKMS_72, 
    t0.`residual_value (%)` AS residual_value_73, 
    t0.`interest_rate (%)` AS interest_rate_74, 
    t0.`insurance (%)` AS insurance_75, 
    t0.coastal_wholesale_price_of_fuel AS coastal_wholesale_price_of_fuel_76, 
    t0.id AS id_77 
FROM fox.trailer t0 WHERE t0.deleted = 0
在我的实体中,我已将反勾号添加到我的列名中,例如

/**
 * @var string
 * @ORM\Column(name="`discount_structure (%)`", type="decimal", precision=10, scale=2, nullable=false)
 */
private $discountStructure;
我打电话的时候

$trailes=$this->em->getRepository('FoxBundle:Trailer')->findBydeleted(0)

我得到以下错误

[Doctrine\DBAL\Exception\SyntaxErrorException]                                                                                                                                                                                            
  An exception occurred while executing 'SELECT t0.trailer_number AS trailer_number_1,t0.discount_structure (%) AS discount_structure_68, t0.net_purchase_price AS net_purchase_price_69, t0.capitalised_extras AS capitalised_extras_70, t0.maximum_write-off_period (Months) AS maximum_writeoff_periodMonths_71, t0.maximum_write-off_period (KMS) AS maximum_writeoff_periodKMS_72, t0.residual_value (%) AS residual_value_73, t0.interest_rate (%) AS interest_rate_74, t0.insurance (%) AS insurance_75, t0.coastal_wholesale_price_of_fuel AS coastal_wholesale_price_of_fuel_76, t0.id AS id_77 FROM trailer t0 WHERE t0.deleted = ?' with params [0]:                                                                                                                                                                      

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%) AS discount_structure_68, t0.net_purchase_price AS net_purchase_price_69, t0.' at line 1
我没有数据库,因此无法更改列名。
我还可以做些什么来让findBy()函数工作吗?

在实体列名中添加反勾号确实有效

/**
 * @var string
 * @ORM\Column(name="`discount_structure (%)`", type="decimal", precision=10, scale=2, nullable=false)
 */
private $discountStructure;
您必须记住清除缓存

php bin/console cache:clear 
php bin/console cache:clear --env=prod 
php bin/console doctrine:cache:clear-metadata 
php bin/console doctrine:cache:clear-query 
php bin/console doctrine:cache:clear-result

这不是一个答案,因为你知道如何解决你的错误,但在某种程度上避免了这些事情,如果你只是使用简单的名字(这是无论如何建议),你不会有任何问题。只需保持平面a-z/u,没有花哨的符号。如果你真的想,你甚至可以在简单的名称后面加上“百分比”之类的后缀。@JennevanderMeer我也会将只使用的字母数字字符减半,但我没有创建数据库,只有对它的读取权限,所以我不能更改列名。我只做了一个小测试
name=“`name(%)`
,还有一个findAll,效果很好,所以我不认为这是问题所在,repo函数findbydeletted做什么?@JennevanderMeer刚刚测试findAll()对我也有效。findByColumnName(“参数”)允许您按特定条件进行筛选。在我的例子中,我希望记录没有被标记为已删除(即deleted=false)。我不确定它在后台是如何做到的。我无法重现这一点,即使在我的测试实体中添加一个已删除的属性并执行findByDeleted也能正常工作。恐怕您必须在stacktrace/symfony调试工具栏中做一些真正深入的挖掘,它可能会告诉您更多信息(如果单击图标,您可以看到查询详细信息)。您还可以尝试一件小事(我认为这不会在内部改变任何东西),那就是尝试
…->findBy(['deleted'=>0])并且可能更新?我的测试实例来自大约两周前。但我从来没有真正深入到这么深,所以除了这个,我也没有想法