請教一下撈取 db 寫作方式問題
當有一個 user 表,內有 name,sex,age,birthday,phone,address,datetime 等多個欄位,可能在不同情境下,會用上述一個或多個欄位撈用戶資料。
目前寫法是在前 db 組語法時,用 if 判斷該參數是否有值或非 0,有就補進去一起撈,好處是只要寫一個 function 滿足各種搜尋條件,缺點是撈 db 這個 function 裡會有許多 if 判斷,不這麼做會產生一堆 function,每次看到一長串 if 就會想,難道就沒有更好做法?
if params.name != "" {
組語法補 and name = ?
}
if params.sex != "" {
組語法補 and sex = ?
}
if params.age != 0 {
組語法補 and age = ?
}
if params.birthday != "" {
組語法補 and birthday = ?
}
if params.phone != "" {
組語法補 and phone = ?
}
if params.address != "" {
組語法補 and = ?
}
if params.startTime != "" {
組語法補 and dateTime >= ?
}
if params.endTime != "" {
組語法補 and dateTime < ?
}
.
.
.
.
最後再執行db query,取出資料後
再做一些日期轉換、型別轉換等資料處理,組合成商業邏輯需要的資料結構後 return
使用程式語言 go、php,會用 orm 或 raw sql query
如果是我,可能會選擇這些欄位一起撈出來,後續再做業務邏輯相關的判斷
覺得不好就重構他!!
但重構後不一定會比較好就對了~~
go、php我都不會,但他們都算是物件導向的語言吧?
物件導向有三大特性裡其中之一叫多型(Polymorphism),多型又分為多載(Overloading)和覆寫(Overriding)
多載(Overloading)就是您想要的。
我必須說,真的是有很多這種需求
但我不懂你的語言,以C#來說,可以使用Entity來操作
建立查詢條件的class,把查詢條件帶入Function,用EF下Where語法來套,會比SQL語法串接美觀很多
不然一直串SQL其實不是普通的醜又煩XD
商業邏輯記得搬去一個位置集中
如果是 mysql , 我會這麼寫
Select *
from user
Where
name regexp ?
and sex regexp ?
and age regexp ?
and birthday regexp ?
and phone regexp ?
and address regexp ?
這樣就不用判斷 != ""
regexp 很好用,有值或無值都適用
感謝回覆,我是頭一次看到這樣的用法,但都 and 多個條件了,如果沒帶其中一個參數,不會掛掉嗎
沒有參數,就等於是空白了,所以,不會掛掉。
給你個讚
select *
from xuser
where xname = coalesce(input_name, xname)
and sex = coalesce(input_sex, sex)
and birthday >= coalesce(input_startdate, birthday)
and birthday <= coalesce(input_enddate, birthday)
user,name 是ANSI SQL 保留字,所以我改用xuser,xname. coalesce() 是ANSI SQL 標準函數.
您可以考虑使用查询构建器(query builder)或 ORM(对象关系映射)来编写更简洁、可维护的代码。
查询构建器是一种 API,它允许您使用方法链来构建 SQL 查询语句,而无需手动编写 SQL 代码。ORM 是一种将数据库表映射到对象的技术,它允许您使用面向对象的方式来操作数据库,而无需直接编写 SQL 代码。
以下是一个使用查询构建器的示例代码片段,用于从 user 表中获取用户数据:
<?php
// 假设 $params 是一个包含搜索参数的关联数组
$params = [
'name' => 'John',
'age' => 30,
'address' => '123 Main St',
// ...
];
// 构建查询语句
$query = $db->table('user');
foreach ($params as $key => $value) {
if ($value) {
$query->where($key, $value);
}
}
$result = $query->get();
// ...
?>
在上面的示例中,我们使用 Laravel 查询构建器来构建 SQL 查询语句。我们首先将 user 表传递给 table 方法,然后使用 foreach 循环遍历搜索参数,并使用 where 方法根据参数构建查询。最后,我们使用 get 方法执行查询并获取结果。
使用查询构建器,您可以轻松地构建复杂的查询,而不需要编写大量的 SQL 代码。您也可以使用 ORM 来编写更具有表现力和可维护性的代码,这可以提高代码的可读性和可重用性,同时也可以减少代码中的冗余和错误。