查詢資料
🔍 各種條件搜尋與查詢取得資料
情境
資料庫

Model
namespace M;
class User extends Model {}查詢方式
查詢方式主要有四種,分別是 one、first、last、all。
one、first與last皆是取得 單筆結果 方式,而all則是取得 多筆結果。one、first是取得結果的 第一筆last是取得結果的 最後一筆all是取得所有結果,以物件的 陣列 方式呈現。
$user = \M\User::one();
echo $user->name; // OA
$user = \M\User::first();
echo $user->name; // OA
$user = \M\User::last();
echo $user->name; // OC
$users = \M\User::all();
foreach ($users as $user) {
echo $user->name;
// 會依序印出 OA、OB、OC
}使用條件
主要分兩種方式:
方法優先
條件優先
// 方法優先
$user = \M\User::one(['where' => ['age < ? AND id > ?', 20, 1]]);
echo $user->name; // OC
// 條件優先
$user = \M\User::where('age < ?', 20)->and('id > ?', 1)->one();
echo $user->name; // OC簡寫
在沒有其他條前如 select、limit、offset、order 時,會以「方法優先」為主要寫法,並且可採用簡寫的方式。
$user = \M\User::one('age < ? AND id > ?', 20, 1);
echo $user->name; // OC如果只是為了查詢某一筆 id 的話,也可以再簡寫如下:
$user = \M\User::one(2);
echo $user->name; // OB 這邊可能會有疑問,為何要用 ["id > ?", 1] 的方式,而並不是直接 "id > 1",主要是以 PHP PDO 的 prepare 與 execute 角度設計,參考此篇
採用此方式可以增加安全性、防止 sql injection,當然如果有些確定值要直接 "id > 1" 也是可以的,如果是字串的查詢,仍建議拆開
$user = \M\User::one(['where' => 'age < 20 AND id > 1']);
echo $user->name; // OC
$user = \M\User::one('age < 20 AND id > 1');
echo $user->name; // OC
$user = \M\User::where('age < 20 AND id > 1')->one();
echo $user->name; // OCWhere IN
寫法必須採用 (?) 並給予對應的陣列參數。
// 方法優先的寫法
$users = \M\User::all('id IN (?)', [1, 3]);
foreach ($users as $user) {
echo $user->name;
// 會依序印出 OA、OC
}
// 條件優先的寫法
$users = \M\User::where('id IN (?)', [1, 3])->all();
foreach ($users as $user) {
echo $user->name;
// 會依序印出 OA、OC
}進階條件
需要加入 limit、offset 時就不可簡寫。
// 方法優先的寫法
$user = \M\User::one([
'limit' => 10,
'offset' => 1,
'where' => ['id > ?', 0]]);
echo $user->name; // OB
// 條件優先的寫法
$user = \M\User::where('id > ?', 0)->one([
'limit' => 11,
'offset' => 1]);
echo $user->name; // OB以上介紹的條件,不只在 one 可以用,如開始提到的 one、first、last、all 皆可使用。
// 方法優先的寫法
$users = \M\User::all('id > ?', 1);
foreach ($users as $user) {
echo $user->name;
// 會依序印出 OB、OC
}
// 條件優先的寫法
$users = \M\User::where('id > ?', 1)->all();
foreach ($users as $user) {
echo $user->name;
// 會依序印出 OB、OC
}進階方法
除 one、first、last、all 方法外,也有個方法 count 可以提供快速的查詢筆數,其範例如下:
$total = \M\User::count();
echo $total; // 3count 亦可配合上述的條件情境使用。
// 方法優先的寫法
$total = \M\User::count('id > 1');
echo $total; // 2
// 條件優先的寫法
$total = \M\User::where('id > ?', 1)->count();
echo $total; // 2型態
由 one、first、last 所取得的資料皆會包裝成該 Model 的物件,配合其欄位建立對應的物件變數(未使用 select 情況下)。
如果取不到任何資料時,則會回 null,如下範例:
$user = \M\User::one(4); // id = 4
echo $user ? $user->name : 'NULL'; // NULL
$user = \M\User::one(3); // id = 3
echo $user ? $user->name : 'NULL'; // OC由 all 所取得的資料就會包裝成該 Model 物件的陣列型態,如果取不到任何資料時,則會回傳 空陣列。
$users = \M\User::all();
echo count($users); // 3
echo $users[1]->name; // OB
$users = \M\User::all('id IN (?)', [4, 5, 6]);
echo count($users); // 0Last updated
Was this helpful?