为了账号安全,请及时绑定邮箱和手机立即绑定

每次调用函数前又都要构造对象,也挺麻烦,感觉用起来不自然。有什么好的方法解决吗?

每次调用函数前又都要构造对象,也挺麻烦,感觉用起来不自然。有什么好的方法解决吗?

阿波罗的战车 2023-04-16 18:14:20
想写个灵活拼接sql语句的函数,把select,from,where,group by,order by,limit这些都作为参数传递。但是如果每一个都作为独立的参数传递,调用函数的时候,就会受到参数顺序的限制,简单的sql也可能写好几个无用空参数。如果要是通过构造一个对象来传递所有参数,参数列表短了,也不受顺序限制了,但是每次调用函数前又都要构造对象,也挺麻烦,感觉用起来不自然。有什么好的方法解决吗?
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

如果你不喜欢面对对象的语法:

query().from("user")
    .where(
      (user.firstName.like("Bob")).or(user.firstName.like("Ann")))
    .orderBy(user.firstName.asc())
    .list(user);

面向对象语法:

InsertSQL sql = new InsertSQL();sql.insertInto("students")
   .value("id", new Integer(id))
   .value("name", name)
   .value("gender", gender);

-----------------------------------
最后赠送你一个我以前用过的DSL

/**
 * 配置路由规则
 */RouteBuilder builder = new RouteBuilder() {    public void configure() {        from("/user").filter(header("language").isEqualTo("zh")).to("/zh/user");        from("/user/edit/3").choice()
            .when(header("foo").isEqualTo("bar")).to("queue:d")
            .when(header("foo").isEqualTo("cheese")).to("queue:e")
            .otherwise().to("queue:f");
    }
};

具有表达性的代码是:做什么,而不是怎么做。


查看完整回答
反对 回复 2023-04-20
?
炎炎设计

TA贡献1808条经验 获得超4个赞

不知道有多少人做过这种"灵活"拼SQL的东西,我想他们最后都会发现,SQL太灵活,语言太死板,拼来拼去也不会让人满意。

一个可行的实践是将SQL语句集中起来。实际上每次去找数据库的SQL语句中变量并不多,完全可以事先写好SQL语句,分配个id,简单包装一下,在调用的时候给出参数。

这样做的好处至少有这两个:
1. 可以保证sql语句经过测试,用上了该用的索引
2. 参数化查询可以避免SQL注入攻击


查看完整回答
反对 回复 2023-04-20
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

  1. 针对SQL而言,建议直接拼SQL或找个框架吧,比如Yii框架的就支持下面这样的写法:(是不是简单多了呢?)

$rows = (new \yii\db\Query())
    ->select(['id', 'email'])
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->limit(10)
    ->all();
  1. 针对问题标题本身——“php中如何解决函数参数列表过长问题”——PHP有个很强大的array,可以用它来传参数呀(变相的命名参数):

function foo($params){    $params = array_merge(array(            'select' => 'default selector',            'where' => 'default where',            // ...
       ), $params);    // do something with $params...

}


查看完整回答
反对 回复 2023-04-20
  • 3 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信