亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

每次調用函數前又都要構造對象,也挺麻煩,感覺用起來不自然。有什么好的方法解決嗎?

每次調用函數前又都要構造對象,也挺麻煩,感覺用起來不自然。有什么好的方法解決嗎?

阿波羅的戰車 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 關注
  • 240 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號