我有选择查询数据库的列表要求
,这是fuelphp中的查询功能数据库
我的问题
当我使用ORM Mapper时,我对灵活点有疑问。我读过this和this,说ORM无法按表的字段选择,ORM可以获取表中的所有列,如果连接表将传递大量数据,但ORM是高安全性我现在不快或不快也许有人可以解释,但我认为会慢,因为ORM获取所有数据,只是我的意见。
当我使用Direct Query时,我的安全性有问题,因为可以使用SQL注入,但使用Direct Query我们可以自定义查询数据库&我认为速度会比ORM增加。
当我使用查询构建时,当我想加入两个或更多表时,我有问题,这个功能在fuelphp中仍然不可用,但是使用查询构建器安全性优于Direct Query&我认为速度会提高。
好的,这只是我的意见,实际上我想使用ORM,因为我比其他人更喜欢安全性,这是非常重要的。
我的问题
答案 0 :(得分:5)
ORM本质上通常会稍慢,是的。但是,就像你说它的灵活性是表现可能来自牺牲的地方。 ORM具有它的用途,并且对于某些场景非常有用,这些场景在整个网络上都有更详细的记录,包括你在问题中提供的链接,因此我将详细描述其中的好处和缺陷。
直接查询可能会受到SQL注入的影响,但您可以将它们转义并使其自行安全。作为一个基本示例(如下所示),您可以将以下内容传递给DB类。在ORM和查询构建器无法生成所需SQL的情况下,直接查询很有用。但是,使用直接查询意味着您不一定能够切换到不同的数据库引擎(例如MySQL到Mongo),您可以使用ORM或查询构建器。出于这个原因,我个人远离直接查询。
$query = sprintf("SELECT * FROM table WHERE name = '%s'", DB::escape($yourstring));
查询构建器适用于完成ORM模型不具备的查询或编写模型过多的查询。从中编译SQL有一点点开销,但通常这可以忽略不计。查询构建器能够加入无限数量的表。您只需多次调用join()
和on()
函数即可。例如
DB::select('*')->from('table')
->join('table2', 'right')->on('table2.column', '=', 'table.column')
->join('table3', 'right')->on('table3.column', '=', 'table.column')
您也可以根据需要拨打on()
的电话号码。
如上所述,每个选项都适用于不同的场景。因此,您会发现在您需要时选择最合适的选项将是您的最佳选择。