iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 27
0
Software Development

30天快速上手Laravel系列 第 27

Day27-[DB 操作] Query Builder More

  • 分享至 

  • xImage
  •  

where

下where子句查詢,其中where有三個參數

  1. 欄位名稱
  2. 運算子 (資料庫所支援的任何運算子)
  3. 對欄位評估的值

範例

$users = DB::table('users')->where('votes', '>=', 100)->get();

//如果是等於的話可以直接這樣寫
$users = DB::table('users')->where('votes', 100)->get();

//可以支援array
$users = DB::table('users')->where([
    ['status', '=', '1'],
    ['subscribed', '<>', '1'],
])->get();

or 語法

跟where接收的參數相同

$users = DB::table('users')
                    ->where('votes', '>', 100)
                    ->orWhere('name', 'John')
                    ->get();

其他 where

whereBetween / whereNotBetween

取得特定條件介於兩個範圍之間的資料,not則相反

$users = DB::table('users')->whereBetween('votes', [1, 100])->get();

日期也可以用,不過要小心如果是預設的 created_at 或是 updated_at 因為有包含時間,會變成超過01秒以後就不在範圍內

範例: ->whereBetween('created_at', ['2018-09-28', '2018-10-01']),
則2018-10-01 00:00:00 (OK)
2018-10-01 00:00:01 (不包含)

whereIn / whereNotIn

取得特定條件包含在給定的陣列之內的資料,not則相反

$users = DB::table('users')->whereIn('id', [1, 2, 3])->get();

whereNull / whereNotNull

取得特定條件為null的資料,not則相反

$users = DB::table('users')->whereNull('updated_at')->get();

whereDate / whereMonth / whereDay / whereYear / whereTime

取得特定條件為給定值的資料,這個是laravel為了方便使用包裝的方法,跟一般的where使用結果一樣,但是可以直接用method處理

$users = DB::table('users')->whereDate('created_at', '2016-12-31')->get();

whereColumn

兩個欄位做比較,而非指定值

//first_name 等於 lastname
$users = DB::table('users')->whereColumn('first_name', 'last_name')->get();

//中間可以加運算子
$users = DB::table('users')->whereColumn('updated_at', '>', 'created_at')->get();

//一樣可以用array,會是用and的方法join
$users = DB::table('users')
                ->whereColumn([
                    ['first_name', '=', 'last_name'],
                    ['updated_at', '>', 'created_at']
                ])->get();

Parameter Grouping

有時候我們會需要比較複雜的where條件

DB::table('users')
            ->where('name', '=', 'John')
            ->orWhere(function ($query) {
                $query->where('votes', '>', 100)
                      ->where('title', '<>', 'Admin');
            })
            ->get();

上面的會等於底下的sql

select * from users where name = 'John' or (votes > 100 and title <> 'Admin')

Where Exists Clauses

如果要使用where exists SQL 子句

DB::table('users')
            ->whereExists(function ($query) {
                $query->select(DB::raw(1))
                      ->from('orders')
                      ->whereRaw('orders.user_id = users.id');
            })
            ->get();

上面的會等於底下的sql

select * from users
where exists (
    select 1 from orders where orders.user_id = users.id
)

JSON Where Clauses

現在有越來越多人會考慮在table欄位裡面放入JSON資料,
因此laravel也提供了Json的查詢方式,使用關鍵字->

$users = DB::table('users')
                ->where('options->language', 'en')
                ->get();

也可以查詢json arrays,注意SQLite不支援

$users = DB::table('users')
                ->whereJsonContains('options->languages', 'en')
                ->get();

MySQL 和 PostgreSQL 則支援查詢多個值

$users = DB::table('users')
                ->whereJsonContains('options->languages', ['en', 'de'])
                ->get();

另外也可以用 whereJsonLength 查詢 JSON arrays 的長度

$users = DB::table('users')
                ->whereJsonLength('options->languages', 0)
                ->get();

$users = DB::table('users')
                ->whereJsonLength('options->languages', '>', 1)
                ->get();

insert

記得如果用insert的話,created_atupdated_at 欄位要自己寫入時間

DB::table('users')->insert(
    ['email' => 'john@example.com', 'votes' => 0]
);

如果要取得新增的id可以用 insertGetId

$id = DB::table('users')->insertGetId(
    ['email' => 'john@example.com', 'votes' => 0]
);

update

DB::table('users')
            ->where('id', 1)
            ->update(['votes' => 1]);

一樣可以用json,不過只支援MySQL 5.7+

DB::table('users')
            ->where('id', 1)
            ->update(['options->enabled' => true]);

deletes

DB::table('users')->where('votes', '>', 100)->delete();

如果要清空整張table,這個會連auto-incerment 的ID都重設為0

DB::table('users')->truncate();

結論: 其實關於DB操作的內容真的很多,之後的Eloquent Model的部分也是,因為時間剩下不多,所以只挑比較常用基本的跟大家介紹,其他還有更多方法歡迎參考laravel官網。

參考連結:


上一篇
Day26-[DB 操作] Query Builder 介紹
下一篇
Day 28-[DB 操作] Eloquent ORM 取回資料
系列文
30天快速上手Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言