Php MySQL上具有特殊字符列的Doctrine findBy()
我有一个MySQL表,其简短描述如下Php MySQL上具有特殊字符列的Doctrine findBy(),php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我有一个MySQL表,其简短描述如下 +-----------------------------------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------------------------+------
+-----------------------------------+---------------+------+-----+---------+----------------+
| 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])代码>并且可能更新?我的测试实例来自大约两周前。但我从来没有真正深入到这么深,所以除了这个,我也没有想法