想象一个由f3的SQL-Mapper查询的具有两列col1和col2的MySQL表,如下所示:
$rows = $mapper->find();
$rows = $mapper->select('col1');
使用 find 时,都会查询并返回两列,并且可以像这样访问它们:
... = $rows[0]->col1;
... = $rows[0]->col2;
使用 select 时,调用 $ rows [0]-> col2 将返回null,因为 col2 不包含在 select 方法,很好。
现在,当执行var_dump时,我注意到 select 方法返回所有列!为什么会这样?
我认为 select 方法的目的是通过仅查询指定的列来节省数据库服务器上的资源。那么,SQL-Mapper: select方法的目的是什么?如果它返回完整的列集–我们有 find 方法,不是吗?
答案 0 :(得分:1)
Fat-Free SQL映射器的目的是将表列自动映射到PHP对象属性。这是在DB\SQL\Mapper::__construct
的实例化时间完成的。
因此,当您调用$mapper->find()
或$mapper->select()
时,实例化已经执行,并且表列已映射到$mapper
对象。
这说明了您的var_dump
命令的结果。
现在您可以调整实际映射的列的列表,但这必须在实例化时完成:
// map all columns
$mapper = new DB\SQL\Mapper($db,'table_name');
// only map col1 & col2 columns
$mapper = new DB\SQL\Mapper($db,'table_name','col1,col2');
关于select()
方法,我想知道为什么将此方法公开。 find()
在内部使用它,但是考虑到所有指定的字段必须在实例化时匹配声明的列,并且计算的列应同时使用别名和声明,因此单独使用它并不方便。参见:
$mapper = new DB\SQL\Mapper($db,'table_name','col1,col2');
// ex.1: column not declared
$results = $mapper->select('*');
echo $results[0]->col3; // undefined field col3
// ex.2a: computed column not aliased
$results = $mapper->select('SUM(col1)');
echo $results[0]->{'SUM(col1)'}; // undefined field SUM(col1)
// ex.2b: computed column aliased but not declared
$results = $mapper->select('SUM(col1) AS sum1');
echo $results[0]->sum1; // undefined field sum1
// ex.2c: computed column declared but not aliased
$mapper->sum1 = 'SUM(col1)';
$results = $mapper->select('SUM(col1)');
echo $results[0]->sum1; // empty
// ex.2d: computed column aliased and declared
$mapper->sum1 = 'SUM(col1)';
$results = $mapper->select('SUM(col1) AS sum1');
echo $results[0]->sum1; // OK!
如您所见,此方法的用法非常严格。除非您真的知道自己在做什么,否则我不建议您使用它。请改用find()
。