查詢資料

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

情境

資料庫

Model

namespace M;

class User extends Model {}

查詢方式

查詢方式主要有四種,分別是 onefirstlastall

  • onefirstlast 皆是取得 單筆結果 方式,而 all 則是取得 多筆結果

  • onefirst 是取得結果的 第一筆

  • 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
}

使用條件

主要分兩種方式:

  1. 方法優先

  2. 條件優先

// 方法優先
$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

簡寫

在沒有其他條前如 selectlimitoffsetorder 時,會以「方法優先」為主要寫法,並且可採用簡寫的方式。

$user = \M\User::one('age < ? AND id > ?', 20, 1);
echo $user->name; // OC

如果只是為了查詢某一筆 id 的話,也可以再簡寫如下:

$user = \M\User::one(2);
echo $user->name; // OB

Where 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
}

進階條件

需要加入 limitoffset 時就不可簡寫。

// 方法優先的寫法
$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 可以用,如開始提到的 onefirstlastall 皆可使用。

// 方法優先的寫法
$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
}

進階方法

onefirstlastall 方法外,也有個方法 count 可以提供快速的查詢筆數,其範例如下:

$total = \M\User::count();
echo $total; // 3

count 亦可配合上述的條件情境使用。

// 方法優先的寫法
$total = \M\User::count('id > 1');
echo $total; // 2

// 條件優先的寫法
$total = \M\User::where('id > ?', 1)->count();
echo $total; // 2

型態

onefirstlast 所取得的資料皆會包裝成該 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); // 0

Last updated

Was this helpful?