引言
鑑於上一章標題引發一些開發同窗的巨大興趣,本文咱們接着此種行文方式繼續咱們的「Laravel宇宙」系列文章。laravel
咱們在前一些章節,相繼使用遷移建立了數據庫結構,使用seeder爲數據庫填充了假數據,如今咱們要對數據進行操做了。程序員
哪些操做?增刪改查!數據庫
本文先不說模型,說說直接的查詢構造器,說說怎麼把數據篩選出來,這用的應該是最多的了。編程
代碼時間
提及柔順,你想起來什麼?是擼代碼,沒錯,就是它。微信
你們看看下面這個代碼寫法柔順不柔順:閉包
$users = DB::select(['table' => 'users', 'where' => ['type' => 'donor']]);
咱們說擼代碼,是有一個從前到後,絲滑連貫的感覺的,上面這段不柔順,它在各個參數位置傳入了各類結構的數據,app
不只看上去亂,寫上去亂,連代碼本身都以爲亂。測試
下面是laravel裏用的最多的寫法:ui
$users = DB::table('users')->where('type', 'donor')->get();
這些是否是順多了,一鼓作氣,要的就是這個感受。spa
爲了演示查詢構造器的功能用法,咱們直接使用 DB 門面建立 QueryBuilder 對象。好比執行原生的語句:
DB::statement('drop table users')
還有參數綁定的方式傳入SQL語句:
DB::select('select * from contacts where validated = ?', [true]);
這種是按照參數順序依次綁定的,還能夠使用佔位符和鍵值對的方式:
$usersOfType = DB::select('select * from users where type = :type', ['type' => $userType]);
這樣綁定的參數就不會擔憂傳入的次序了。
咱們引入查詢構造器,引入模型,就是爲了擺脫繁雜的SQL語法,這裏又傳入原生語句,不提倡!
寫一條不附加任何約束條件的查詢:
$users = DB::table('users')->get();
還有複雜的多表聯合查詢,使用 INNER JOIN 方式:
DB::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.type', 'valid');
})
->get();
上面這個寫法就是咱們經常使用的SQL寫法,生成的SQL語句以下:
SELECT * FROM `users` INNER JOIN `contacts` ON `user`.`id` = `contacts`.`user_id` WHERE `contacts`.`type` = `valid`;
對於寫操做,咱們也使用參數位置綁定的方式展現:
DB::insert('insert into contacts (name, email) values (?, ?)',['sally', 'sally@me.com']);
這一條是建立新的數據條目,還有更新數據:
$countUpdated = DB::update('update contacts set status = ? where id = ?',['valie', $id]);
和按照條件刪除條目:
$countDeleted = DB::delete('delete from contacts where archived = ?',[true]);
爲了編程愉悅感,仍是迴歸咱們的laravel推薦的鏈式操做的方式來演示更多更復雜的功能。舉例一些常規的查詢:
$emails = DB::table('contacts')->select('email', 'email2 as second_email')->get();
select 方法用於指定SQL返回哪些列。能夠指定多個,也能夠使用 addSelect 追加:
$emails = DB::table('contacts')->select('email')->addSelect('email2 as second_email')->get();
多個約束條件的查詢:
$newVips = DB::table('contacts')->where('vip', true)->where('created_at', '>', Carbon::now()->subDay())->get();
複雜的查詢莫過於使用多表聯合查詢,使用子查詢,使用比較繞的or查詢,咱們對or查詢舉兩個例子,
你們在調試的時候,必定要對本身寫的代碼打印一下最終生成的SQL語句反覆檢查和測試,以下降故障。
好比兩個條件:
$priorityContacts = DB::table('contacts')->where('vip', true)->orWhere('created_at', '>', Carbon::now()->subDay())->get();
這一條要求要麼vip是true,要麼created_at字段在一天之內。還有更復雜的,須要使用閉包的方式組裝:
$contacts = DB::table('contacts')
->where('vip', true)
->orWhere(function ($query) {
$query->where('created_at', '>', Carbon::now()->subDay())
->where('trial', false);
})
->get();
上面的代碼主旨上仍是兩個條件的 OR,只不過第二個條件包含更多的約束。生成的語句應該是下面這樣的:
SELECT * FROM contacts WHERE vip = 1 OR (trial = 0 AND created_at > '2020-10-30 11:00:00');
好吧,查詢的用法先介紹到這兒,更多的查詢,咱們後面的代碼會用的不少,再給你們慢慢細講。
寫在最後
本文輕描淡寫地講解了laravel中的查詢構造器,講了一個比較複雜的OR查詢,由於使用閉包組裝WHERE約束條件,因此會有些難以理解,
不過對比打印生成的SQL語句後,你們應該會豁然開朗!
Happy coding :-)
我是@程序員小助手,專一編程知識,圈子動態的IT領域原創做者
本文分享自微信公衆號 - 程序員小助手(mql45ea)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。