f3 /无脂肪框架:为什么SQL-Mapper select函数返回表中的所有列?

时间:2018-11-04 10:48:48

标签: php fat-free-framework

想象一个由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 方法,不是吗?

1 个答案:

答案 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()