这听起来很傻,但相信我,这是为了一个好的(即过度设计的)原因。
是否可以使用 IN 子句编写 SQL 查询,该子句选择该表中的所有内容而不知道该表的任何内容?请记住,这意味着您不能使用引用该表的子查询。
换句话说,我想在以下查询中找到一个替换“SOMETHING”的语句:
SELECT * FROM table_a WHERE table_a.id IN (SOMETHING)
以便结果与以下内容相同:
SELECT * FROM table_a
除了改变“某事”的价值之外什么都不做
为了满足好奇,我将分享这个问题的原因。
1) 我有一个 FactoryObject 抽象类,它使用两个模板方法授予所有扩展它的模型一些光荣的工厂方法魔法:getData() 和 load()
2) 模型必须实现模板方法。getData 是一个静态方法,它接受 ID 约束、从数据库中提取行并返回一组关联数组。load 不是静态的,接受关联数组,并根据该数组填充对象。
3)FactoryObject的非抽象部分实现了一个getObject()和一个getObjects()方法。这些调用 getData、创建对象和 load() 来自 getData 的数组响应以创建和返回填充对象。
getObjects() 需要 ID 约束作为输入,可以是列表形式,也可以是子查询形式,然后将其传递给 getData()。我希望可以不传递任何 ID 约束来获取所有对象。
问题是只有模型知道他们的表。getObjects() 是在更高级别实现的,因此它不知道要传递什么 getData(),除非 IN 有一个通用的“返回所有内容”子句。
还有其他解决方案。我可以修改 API 以要求 getData 接受特殊参数并返回所有内容,或者我可以在模型级别实现静态 getAll[ModelName]s() 方法,该方法调用:
static function getAllModelObjects() {
return getObjects("select [model].id from [model]");
}
这是合理的,无论如何可能适合架构,但我很好奇,所以我想我会问!