引言
上一篇介紹了如何在windows環(huán)境下跑一個 laravel
項目,這一篇寫如何使用 laravel 中的 查詢構造器
實現(xiàn)增刪改查。
讀這篇文章時我默認你已擁有如下知識:
- 了解php的基礎語法
- 了解數(shù)據(jù)庫設計
- 了解常用的sql查詢
正文
實現(xiàn)增刪改查前, 我們先準備一些步驟:
- php, nginx, mysql 服務正確啟用
- 新建一個數(shù)據(jù)庫及其數(shù)據(jù)表
開啟服務我們打開上篇文章介紹的 Wnmp.exe
-> Start all
然后cmd上鍵入命令:
D:/wnmp/Wnmp/php/php-cgi.exe -b 127.0.0.1:9000 -c D:/wnmp/Wnmp/php/php.ini
新建一個數(shù)據(jù)庫, 我命名為 shop
, 然后新建兩張表
分別:
goods -> 商品表 user -> 用戶表
數(shù)據(jù)表新建完成后, 我往里面隨意插入了幾條數(shù)據(jù), 下圖:
準備步驟已經完成, 我們打開上篇文章介紹的 testLaravel
項目
查看Laravel文檔能夠知道 數(shù)據(jù)庫配置
在 config/database.php
里,
因為我們是mysql數(shù)據(jù)庫, 所以找到對應的mysql選項:
查看 database.php
文件的mysql配置我們能夠看到配置值是 變量
, 指向的是項目根目錄的 .env
文件
打開 .env
文件, 我們填寫對應的mysql真實配置, 下圖:
配置大家看對應的key值就知道是什么含義了, 這里提下數(shù)據(jù)庫密碼, 為什么是 password
呢? 查看Wnmp安裝目錄, 我們能看到有一個 readme.txt
的文件, 文件的文本內容如下:
Copyright (c) 2012 - 2019, Kurt Cancemi (kurt@x64architecture.com)
Donations are appreciated no matter if big or small.
https://wnmp.x64architecture.com/donate/
Wnmp is an easy Nginx, MariaDB and PHP environment for Windows.
The default login for MySQL/MariaDB/phpMyAdmin is:
username: root
password: password
Note: you can change it via phpMyAdmin
根據(jù)文件內容 我們知道了密碼是: password
, 因為是本地開發(fā)環(huán)境 這里就不更改密碼了,
但如果是生產環(huán)境, 大家使用集成環(huán)境包的時候一定要變更數(shù)據(jù)庫密碼.
另外文中沒有介紹項目的具體目錄結構, 建議大家看下官方文檔, 熟悉一下.
到這里項目的數(shù)據(jù)庫配置就已經配完了, 關聯(lián)了本地的 shop
數(shù)據(jù)庫.
現(xiàn)在我們需要配置一下 路由
, 所有的 Laravel 路由
的配置都在根目錄的 routes
里, routes
目錄中有4個路由配置文件, 這里不談其中區(qū)別, 只關注 web.php
, 后面所有路由我們都在此文件里追加.
看到這里的同學也建議看一下 laravel 的路由文檔, 因為文中講的不是很細, 傳送門:
https://learnku.com/docs/lara...
順便一說, 我個人選擇 laravel
作為深入學習的php框架, laravel優(yōu)雅的路由是我選擇它的一個重要原因.
我這里先寫幾個路由, 大家感受一下:
Route::get('test/queryUsers',['uses' => 'TestController@queryUsers']);
Route::post('test/queryUsers',['uses' => 'TestController@queryUsers']);
Route::get('test/queryUsers/{id}',['uses' => 'TestController@queryUsers']);
Route::match(['get','post'],'test/queryUsers',['uses' => 'TestController@queryUsers']);
Route::any('test/queryUsers',['uses' => 'TestController@queryUsers']);
我們知道熟知的http請求方式有 get
和 post
兩種.
a. 我們來依次解析上面的路由, 先看第1條:
Route::get('test/queryUsers',['uses' => 'TestController@queryUsers']);
此路由指定了 get
方式請求, 路由為 test/queryUsers
, 邏輯會走向 TestController
控制器的 queryUsers
方法
這里出現(xiàn)了兩個名詞 控制器
和 方法
注: laravel是一個 mvc框架
, 關于 mvc
的理解需要自己查些資料看看.
查詢
控制器在項目里的 App/Http/Controllers
目錄里, 這里我新增一個 TestController
控制器, TestController
里新增一個 queryUsers
方法:
?php
namespace App\Http\Controllers;
use app\Member;
use Illuminate\Support\Facades\DB;
use Symfony\Component\Routing\Annotation\Route;
class TestController extends Controller
{
public function queryUsers() {
$users = DB::table('user')->get();
return $users;
}
}
我們先來看結果, 地址欄鍵入(域名 + 路由): http://test.lara.com/test/queryUsers
:
代碼里很亮眼的一行:
DB::table('user')->get();
這行代碼表示查詢 shop數(shù)據(jù)庫 user
表的全部數(shù)據(jù), 所以我們看到 user
表中的3條記錄都被返回了.
b. 現(xiàn)在我們來解析上面路由的第2條:
Route::post('test/queryUsers',['uses' => 'TestController@queryUsers']);
這條路由和第1條路由只有一個 post
的區(qū)別, 沒錯, 這是一個post請求的路由, 我們知道post請求方式無法在瀏覽器地址欄鍵入路由來得到結果, 所以我們需要使用一個工具 Postman
, 這是個好東西, 如果有同學沒用過或是不知道它, 建議查一下熟悉一下, 文中不介紹它.
現(xiàn)在我們在 Postman
新建一個請求, 如圖:
我們點擊 send
得到 :
納尼?怎么沒有得到我們期望的結果, 很顯然哪里不對,我們再來看看路由的文檔:
https://learnku.com/docs/lara...
文檔中我查找與 post
字眼的相關馬跡, 看到:
原來是 CSRF
造成的, 無論是前端同學還是后端同學, 應該都對這個詞不陌生, 跨站請求偽造
laravel 中為了解決 CSRF
這個隱患, 默認有保護機制, 我們需要配置 CSRF 白名單
, 根據(jù)文檔, 我們知道 CSRF 白名單
的配置在 VerifyCsrfToken
中間件里, VerifyCsrfToken
中間件所在路徑:
App/Http/Middleware/VerifyCsrfToken.php
打開文件, 添加 CSRF 白名單
,
protected $except = [
'http://test.lara.com/test/queryUsers',
];
完成這步后我們再打開 postman, 點擊 send
可以看到數(shù)據(jù)如期望返回:
c. 現(xiàn)在我們來解析上面路由的第3條:
Route::get('test/queryUsers/{id}',['uses' => 'TestController@queryUsers']);
可以看出這條路由的區(qū)別在于路由末尾的 {id}
, 開發(fā)中我們會有這樣的需求, 前端傳遞一個用戶id, 后端返回這個id對應的該用戶信息
此時需要修改下 TestController
控制器 queryUsers
方法:
public function queryUsers() {
$id = request()->id; // 此種方式獲取參數(shù)
$users = DB::table('user')->where('id', $id)->get();
return json_encode($users);
}
白話文解釋一下這條sql: 在table表里查詢id = $id(路由傳遞的值)的記錄,
查看結果, 符合預期:
d. 現(xiàn)在我們來解析上面路由的第4條和第5條:
Route::match(['get','post'],'test/queryUsers',['uses' => 'TestController@queryUsers']);
Route::any('test/queryUsers',['uses' => 'TestController@queryUsers']);
這倆路由我就不演示了, 分別解釋一下, match
里路由為指定的請求方式, 一種或多種,
而 any
則是匹配任意方式, 無論是通過 get
還是 post
方式請求, 都能得到我們想要的結果.
我們再看看上面我設計的goods表
我們能看到這兩條數(shù)據(jù)不知道創(chuàng)建的用戶是誰, 但是有uid值, 這時候我們希望一個接口既返回商品信息又能夠讓我知道創(chuàng)建者是誰, 此時就需要用到多表聯(lián)查了, 我們新增一個路由:
Route::get('test/queryGoods',['uses' => 'TestController@queryGoods']);
然后 TestController
里新增一個 queryGoods
方法:
public function queryGoods() {
$goods = DB::table('goods')
->leftJoin('user', 'goods.uid', '=', 'user.id')
->get();
return json_encode($goods);
}
如期望一樣返回數(shù)據(jù):
[{
id: 1,
uid: 1,
name: "測試商品1",
desc: null,
img_urls: null,
price: "99.00",
old_price: "78.00",
real_name: "陳云",
nickname: "窮搖.",
head_url: null,
age: null,
gender: null,
level: null
},
{
id: 2,
uid: 2,
name: "測試商品2",
desc: null,
img_urls: null,
price: "290.00",
old_price: "389.00",
real_name: "歐陽欣欣",
nickname: "小欣欣",
head_url: null,
age: null,
gender: null,
level: null
}
]
但是用戶信息所有字段全部被返回了, 有些時候我們?yōu)榱税踩? 只需要返回指定字段, 比如我們只需要返回 user
表中的 real_name
和 head_url
字段, 那么我們就需要做一下字段的約束:
public function queryGoods() {
$goods = DB::table('goods')
->leftJoin('user', 'goods.uid', '=', 'user.id')
->select('goods.*', 'user.real_name', 'user.head_url')
->get();
return json_encode($goods);
}
關注下這行代碼:
select('goods.*', 'user.real_name', 'user.head_url')
這行代碼表示返回goods表中的 所有字段
以及user表中的 real_name
和 head_url
字段, 就完美達到了我們想要的結果.
新增
至此查詢已經基本寫的差不多了, 我們開始向數(shù)據(jù)表里 新增
數(shù)據(jù)
我們新增一個 post
請求的路由 test/addUser
:
Route::post('test/addUser',['uses' => 'TestController@addUser']);
添加 CSRF 路由白名單
protected $except = [
'http://test.lara.com/test/queryUsers',
'http://test.lara.com/test/addUser',
];
然后 TestController
里新增一個 addUser
方法:
public function addUser() {
$real_name = request()->real_name;
$nickname = request()->nickname;
DB::table('user')->insert(
['real_name' => $real_name, 'nickname' => $nickname]
);
$users = DB::table('user')->get();
return json_encode($users);
}
打開 postman
, 添加參數(shù):
{"real_name":"劉亦菲","nickname":"小菲菲"}
點擊send, 發(fā)現(xiàn)數(shù)據(jù)如期望一樣正確插入.
查詢構造器提供 insert
方法用于插入記錄到數(shù)據(jù)庫中。 insert 方法接收數(shù)組形式的字段名和字段值進行插入操作
DB::table('user')->insert(
['real_name' => $real_name, 'nickname' => $nickname]
);
編輯
我們新增一個 put
請求的路由 test/updateUser
:
同樣添加 CSRF
Route::put('test/updateUser',['uses' => 'TestController@updateUser']);
路由白名單
protected $except = [
'http://test.lara.com/test/queryUsers',
'http://test.lara.com/test/addUser',
'http://test.lara.com/test/updateUser',
];
然后 TestController
里新增一個 updateUser
方法:
public function updateUser() {
$id = request()->id;
$nickname = request()->nickname;
DB::table('user')
->where('id', $id)
->update(['nickname' => $nickname]);
$users = DB::table('user')->get();
return json_encode($users);
}
打開 postman
, 我們知道剛剛新增的記錄返回的 劉亦菲
的id是4, 我們根據(jù) id
來更新下它的 nickname
, postman 里添加請求參數(shù):
{"id":"4", "nickname": "小阿菲~"}
點擊send, 發(fā)現(xiàn)數(shù)據(jù)如期望一樣正確更新.
查詢構造器提供 update
方法用于更新已有的記錄。 接受包含要更新的字段及值的數(shù)組
->where('id', $id)->->update(['nickname' => $nickname]);
刪除
我們新增一個 delete
請求的路由 test/deleteUser
:
Route::delete('test/deleteUser',['uses' => 'TestController@deleteUser']);
同樣添加 CSRF 路由白名單
protected $except = [
'http://test.lara.com/test/queryUsers',
'http://test.lara.com/test/addUser',
'http://test.lara.com/test/updateUser',
'http://test.lara.com/test/deleteUser',
];
然后 TestController
里新增一個 deleteUser
方法:
public function deleteUser() {
$id = request()->id;
DB::table('user')
->where('id', $id)
->delete();
$users = DB::table('user')->get();
return json_encode($users);
}
打開 postman
, 我們現(xiàn)在想把 劉亦菲
的記錄在數(shù)據(jù)庫里刪掉, 我們知道她的 id
是 4, 我們根據(jù) id
來刪除它, 添加請求參數(shù):
{"id":"4"}
點擊send, 發(fā)現(xiàn)數(shù)據(jù)如期望一樣正確刪除 (已經沒有id為4的記錄).
laravel中查詢構造器可以使用 delete
方法從表中刪除記錄。添加 where
子句來約束 delete 的條件:
->where('id', $id)->delete();
文章有很多方法沒有介紹到, 建議需要學習的同學看下文檔, 傳送門:
https://learnku.com/docs/lara...
總結
以上所述是小編給大家介紹的使用Laravel中的查詢構造器實現(xiàn)增刪改查功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
您可能感興趣的文章:- Laravel框架DB facade數(shù)據(jù)庫操作詳解
- Laravel5.7 數(shù)據(jù)庫操作遷移的實現(xiàn)方法
- PHP開發(fā)框架Laravel數(shù)據(jù)庫操作方法總結
- Laravel5中實現(xiàn)模糊匹配加多條件查詢功能的方法
- laravel技巧之查詢構造器Query Builder疊加鏈式調用的方法
- 解決laravel查詢構造器中的別名問題
- Laravel 5框架學習之Eloquent (laravel 的ORM)
- 詳解PHP的Laravel框架中Eloquent對象關系映射使用
- Laravel 5框架學習之Eloquent 關系
- Laravel Eloquent ORM 實現(xiàn)查詢表中指定的字段
- Laravel5.7 Eloquent ORM快速入門詳解
- laravel框架數(shù)據(jù)庫操作、查詢構建器、Eloquent ORM操作實例分析