我试图使查询使用case语句,并且无法弄清楚如何获取case以返回列值而不是常量。我的查询工作正常,只是我为结果提供的列名被Cake引用或以其他方式处理不当,或者可能是PDO在某个无法深入了解的层中的某个地方。我和bindValue差不多,但是我遇到的任何文档都没有告诉我如何做到这一点。
我发现此示例注释:
$statement->bindValue(1, 'a title');
$statement->bindValue(2, 5, PDO::INT);
$statement->bindValue('active', true, 'boolean');
$statement->bindValue(5, new \DateTime(), 'date');
但在所有这些情况下,提供的值都是一个常数。我需要传递一个字符串,该字符串是我要返回的列的名称。
我尝试了两者'string'
(导致加引号的列名)和'integer'
(导致了0)。我尝试过PDO::FETCH_COLUMN
(看起来不太可能,但是看起来像是http://php.net/manual/en/pdo.constants.php的下一个最佳选择,并且容易尝试…)。我尝试过'literal'
,受可将文字字符串放入表达式中的启发(导致Error: unknown type "literal"
)。该错误消息导致我无法正常运行src/Database/Type.php
,但是那里也没有任何帮助。
所以,我很困惑。这是我拥有的代码的简单版本(省略了一些条件和不相关的列):
$query = $this->Games->find();
$team_id = $query->newExpr()->addCase(
[$query->newExpr()->eq('Games.status', 'home_default')],
['home_team_id', 'away_team_id'],
['string', 'string']
);
$defaulting = $query
->select([
'id' => $team_id,
'count' => 'COUNT(Games.id)',
])
->where([
'Games.status IN' => ['home_default', 'away_default'],
])
->group('id')
->toArray();
这将生成此SQL:
SELECT
(CASE WHEN Games.status = 'home_default'
THEN 'home_team_id' ELSE 'away_team_id' END) AS `id`,
COUNT(Games.id) AS `count`
FROM games Games
WHERE Games.status in ('home_default','away_default')
GROUP BY id
请注意,THEN 'home_team_id' ELSE 'away_team_id' END
应该简单THEN home_team_id ELSE away_team_id END
。然后,这将允许我读取已默认游戏的球队的ID列表以及其默认游戏的数量。
默认情况下,传递给的第二个参数的值QueryExpression::addCase()
将被视为转换为
文字值
,而不是
标识符
。如果需要后者,则应使用表达式IdentifierExpression
。
use Cake\Database\Expression\IdentifierExpression;
// ...
$team_id = $query->newExpr()->addCase(
[
$query->newExpr()->eq('Games.status', 'home_default')
],
[
new IdentifierExpression('Games.home_team_id'),
new IdentifierExpression('Games.away_team_id')
]
);
在这种情况下,也请忽略第三个参数,您不希望这些值是字符串文字(对于表达式,无论如何都将忽略类型)。
注意:这是一个理论性的问题,我并不试图修复任何东西,也不试图为了实际目的达到任何效果 在Scala中使用<code>(参数)创建lambda时= Lambdas与方法没有什么不同,它们都被指定为表达式,但就我的理解,方法的返回类型很容易用< code > def name(arguments):return type = expression 语法来定义。 考虑这个(说明性的)例子:
下面对getHighest()和getLowest()的调用返回Comparable类型的对象,而不是T类型的对象,这正是我们想要的。为什么,我该如何改进这段代码,使这些调用返回T(这样T的字段和方法就可用了)? 下一行生成编译器错误: 错误:找不到符号符号:方法getName()位置:接口java.lang.Comparable 我想employee.getHighest()返回一个员工(而不仅
我使用React和Redux,并将动作类型指定为接口,这样我的还原程序就可以利用标记的联合类型来提高类型安全性。 我有如下类型声明: 我想创建创建这些动作的助手函数,我倾向于使用箭头函数。如果我这样写: 编译器无法提供任何帮助来确保这是一个有效的,因为没有明确指定返回类型。我可以通过执行以下操作显式指定返回类型: 但这需要指定我的函数参数两次,因此冗长且难以阅读。 在使用箭头符号时,有没有一种方法
我读过这篇文章:java中arrays.aslist(array)与新arraylist (arrays.aslist(ia))之间的差异 当然,包装器上不允许一些列表操作,比如从列表中添加或删除元素,您只能读取或覆盖元素。 如果list2有List接口的引用,我期望它用Java实现List接口中包含的所有方法。https://docs.oracle.com/javase/7/docs/api/j
经过几次修改后,我得到了一个工作函数,返回类型为nullable Void。但这并不是我所需要的 根据Kotlin文档,Unit类型对应于Java中的void类型。所以Kotlin中不返回值的正确函数是 或
问题内容: 为什么以下代码会编译?该方法返回该类型或其子类的实例。类中的代码调用该方法。编译器允许将返回值存储到类型的变量(显然不在的层次结构中)。 即使在擦除类型之后, 返回类型也不应该仍然是的实例 吗? 该方法的字节码为: 编辑:一致地替换为。 问题答案: 这实际上是合法的类型推断*。 我们可以将其简化为以下示例(Ideone): 因为是接口,所以允许编译器推断(无意义的,实际上是)交集类型。