如果理解你在做什么正确,这里是我会处理这个的方式:
传递PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE
给的第一个参数PDOStatement::fetch()
将返回一个类的对象PDOStatement::fetchColumn(0)
- 换句话说,它确定要从结果集第一列的值实例化的类名。
为了利用这一点,您可以JOIN tobjects ON targetTable.objectType = tobjects.id
选择并选择tobjects.Parameter
结果集中的第一列。如果该Parameter
列已经包含数据库对象类型到类名的 1:1 映射,这就是您需要做的所有事情,但是我不确定是否是这种情况,而且可能不应该是这种情况,因为它使以后更难替换另一个班级。
为了克服这个限制,我建议您在第一次连接数据库时创建一个临时表,它将Parameter
值映射到类名,您可以将其映射JOIN
到查询中以获取目标类名。
所以流程会是这样的:
// Set up the connection
$db = new PDO('mysql:yourDSNhere');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// Create a temp table to store the mapping
$db->query("
CREATE TEMPORARY TABLE `objectMappings` (
`Parameter` INT NOT NULL PRIMARY KEY,
`ClassName` VARCHAR(255)
) ENGINE=MEMORY
");
// A mapping of Parameter IDs to class names
$classMap = array(
1 => 'Class1',
2 => 'Class2',
3 => 'Class3',
// ...
);
// Build a query string and insert
$rows = array();
foreach ($classMap as $paramId => $className) {
// this data is hard-coded so it shouldn't need further sanitization
$rows[] = "($paramId, '$className')";
}
$db->query("
INSERT INTO `objectMappings`
(`Parameter`, `ClassName`)
VALUES
".implode(',
', $rows)."
");
// ...
// When you want to retrieve some data
$result = $db->query("
SELECT m.ClassName, t.*
FROM targetTable t
JOIN tobjects o ON t.objectType = o.id
JOIN objectMappings m ON o.Parameter = m.Parameter
WHERE t.someCol = 'some value'
");
while ($obj = $result->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE)) {
// $obj now has the correct type, do stuff with it here
}