我在 addCase 中指定什么 "type" 到 return 列?
What "type" do I specify in addCase to return a column?
我正在尝试使用 case 语句使查询工作,但无法弄清楚如何将 case 设为 return 列值而不是常量。我的查询工作得很好,除了我为结果提供的列名被 Cake 引用或以其他方式错误处理,或者可能是 PDO 在我无法挖掘的层中的某个地方。我一直深入到 bindValue,但是我一路上遇到的文档 none 告诉我如何做到这一点。
我找到了这个例子评论:
$statement->bindValue(1, 'a title');
$statement->bindValue(2, 5, PDO::INT);
$statement->bindValue('active', true, 'boolean');
$statement->bindValue(5, new \DateTime(), 'date');
但在所有这些情况下,提供的值都是常数。我需要传入一个字符串,它是我想要 returned.
的列的名称
我尝试了 '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()
的第二个参数的值被视为转换为 literal values, not as identifiers。如果你需要后者,那么你应该使用一个表达式,一个 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')
]
);
在这种情况下也放弃第三个参数,您不希望值是字符串文字(对于表达式,类型无论如何都会被忽略)。
我正在尝试使用 case 语句使查询工作,但无法弄清楚如何将 case 设为 return 列值而不是常量。我的查询工作得很好,除了我为结果提供的列名被 Cake 引用或以其他方式错误处理,或者可能是 PDO 在我无法挖掘的层中的某个地方。我一直深入到 bindValue,但是我一路上遇到的文档 none 告诉我如何做到这一点。
我找到了这个例子评论:
$statement->bindValue(1, 'a title');
$statement->bindValue(2, 5, PDO::INT);
$statement->bindValue('active', true, 'boolean');
$statement->bindValue(5, new \DateTime(), 'date');
但在所有这些情况下,提供的值都是常数。我需要传入一个字符串,它是我想要 returned.
的列的名称我尝试了 '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()
的第二个参数的值被视为转换为 literal values, not as identifiers。如果你需要后者,那么你应该使用一个表达式,一个 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')
]
);
在这种情况下也放弃第三个参数,您不希望值是字符串文字(对于表达式,类型无论如何都会被忽略)。