在Doctrine
中,是否可以绑定参数的name(与绑定参数的value相反)?
为什么我需要它
存在具有7个布尔列的表,每个列用于一周中的每一天:monday
、tuesday
等(这些对应于由 * GTFS * 定义的calendar
实体的结构,https://gtfs.org/schedule/reference/#calendarttxt)。
给定一周中的某一天(例如monday
),我想获取所有在星期一可用的行,即:
$statement = $this
->getEntityManager()
->getConnection()
->prepare('
SELECT id
FROM calendar
WHERE monday = 1
');
通常,我希望能够在查询中提供日期的名称,我可以简单地这样做:
->prepare("
SELECT id
FROM calendar
WHERE $dayName = 1
");
我想知道是否有可能使用参数绑定作为参数的名称,例如
$statement = $this
->getEntityManager()
->getConnection()
->prepare('
SELECT id
FROM calendar
WHERE :dayName = 1
');
$statement->bindValue('dayName', $dayName);
其不起作用,参见下文。
我所尝试的
1
WHERE :dayName = 1
转换为以下SQL查询:
SELECT calendar.id
FROM calendar
WHERE 'monday' = 1
并且,因为该条件永远不为真,所以返回空集[]
。
2
WHERE `:dayName` = 1
SELECT calendar.id
FROM calendar
WHERE `'monday'` = 1
Column not found: 1054 Unknown column ''monday'' in 'where clause'
3
WHERE ":dayName" = 1
# no query
Invalid parameter number: number of bound variables does not match number of tokens
1条答案
按热度按时间pbossiut1#
这当然是不可能的。
在语句中,占位符可用作参数标记,以指示稍后执行查询时将数据值绑定到查询的位置。参数标记不应用引号括起来,即使您打算将它们绑定到字符串值。参数标记只能用于应出现表达式的位置,而不能用于SQL关键字、标识符等。
简而言之:您只能对文本(字符串、数字...)使用参数标记
如果你不能改变你的数据库设计,我建议你使用另一个SQL语句,并进行简单的位检查:
现在,通过绑定daynumber(星期一=0,星期二=1,...星期日=6),您可以简单地检查某个服务在特定工作日是否可用。