如何在Laravel中利用查詢構(gòu)造器實(shí)現(xiàn)一個(gè)增刪改查功能?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供郾城網(wǎng)站建設(shè)、郾城做網(wǎng)站、郾城網(wǎng)站設(shè)計(jì)、郾城網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、郾城企業(yè)網(wǎng)站模板建站服務(wù),十余年郾城做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。實(shí)現(xiàn)增刪改查前, 我們先準(zhǔn)備一些步驟:
php, nginx, mysql 服務(wù)正確啟用
新建一個(gè)數(shù)據(jù)庫及其數(shù)據(jù)表
開啟服務(wù)我們打開上篇文章介紹的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
新建一個(gè)數(shù)據(jù)庫, 我命名為shop
, 然后新建兩張表
分別:
goods -> 商品表 user -> 用戶表
數(shù)據(jù)表新建完成后, 我往里面隨意插入了幾條數(shù)據(jù), 下圖:
準(zhǔn)備步驟已經(jīng)完成, 我們打開上篇文章介紹的testLaravel
項(xiàng)目
查看Laravel文檔能夠知道數(shù)據(jù)庫配置
在config/database.php
里,
因?yàn)槲覀兪莔ysql數(shù)據(jù)庫, 所以找到對(duì)應(yīng)的mysql選項(xiàng):
查看database.php
文件的mysql配置我們能夠看到配置值是變量
, 指向的是項(xiàng)目根目錄的.env
文件
打開.env
文件, 我們填寫對(duì)應(yīng)的mysql真實(shí)配置, 下圖:
配置大家看對(duì)應(yīng)的key值就知道是什么含義了, 這里提下數(shù)據(jù)庫密碼, 為什么是password
呢? 查看Wnmp安裝目錄, 我們能看到有一個(gè)readme.txt
的文件, 文件的文本內(nèi)容如下:
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ù)文件內(nèi)容 我們知道了密碼是:password
, 因?yàn)槭潜镜亻_發(fā)環(huán)境 這里就不更改密碼了,
但如果是生產(chǎn)環(huán)境, 大家使用集成環(huán)境包的時(shí)候一定要變更數(shù)據(jù)庫密碼.
另外文中沒有介紹項(xiàng)目的具體目錄結(jié)構(gòu), 建議大家看下官方文檔, 熟悉一下.
到這里項(xiàng)目的數(shù)據(jù)庫配置就已經(jīng)配完了, 關(guān)聯(lián)了本地的shop
數(shù)據(jù)庫.
現(xiàn)在我們需要配置一下路由
, 所有的Laravel 路由
的配置都在根目錄的routes
里,routes
目錄中有4個(gè)路由配置文件, 這里不談其中區(qū)別, 只關(guān)注web.php
, 后面所有路由我們都在此文件里追加.
看到這里的同學(xué)也建議看一下 laravel 的路由文檔, 因?yàn)槲闹兄v的不是很細(xì), 傳送門:
https://learnku.com/docs/lara...
順便一說, 我個(gè)人選擇laravel
作為深入學(xué)習(xí)的php框架, laravel優(yōu)雅的路由是我選擇它的一個(gè)重要原因.
我這里先寫幾個(gè)路由, 大家感受一下:
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請(qǐng)求方式有get
和post
兩種.
a. 我們來依次解析上面的路由, 先看第1條:
Route::get('test/queryUsers',['uses' => 'TestController@queryUsers']);
此路由指定了get
方式請(qǐng)求, 路由為test/queryUsers
, 邏輯會(huì)走向TestController
控制器的queryUsers
方法
這里出現(xiàn)了兩個(gè)名詞控制器
和方法
注: laravel是一個(gè)mvc框架
, 關(guān)于mvc
的理解需要自己查些資料看看.
查詢
控制器在項(xiàng)目里的App/Http/Controllers
目錄里, 這里我新增一個(gè)TestController
控制器,TestController
里新增一個(gè)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; } }
我們先來看結(jié)果, 地址欄鍵入(域名 + 路由):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條路由只有一個(gè)post
的區(qū)別, 沒錯(cuò), 這是一個(gè)post請(qǐng)求的路由, 我們知道post請(qǐng)求方式無法在瀏覽器地址欄鍵入路由來得到結(jié)果, 所以我們需要使用一個(gè)工具Postman
, 這是個(gè)好東西, 如果有同學(xué)沒用過或是不知道它, 建議查一下熟悉一下, 文中不介紹它.
現(xiàn)在我們?cè)?code>Postman 新建一個(gè)請(qǐng)求, 如圖:
我們點(diǎn)擊send
得到 :
納尼?怎么沒有得到我們期望的結(jié)果, 很顯然哪里不對(duì),我們?cè)賮砜纯绰酚傻奈臋n:
https://learnku.com/docs/lara...
文檔中我查找與post
字眼的相關(guān)馬跡, 看到:
原來是CSRF
造成的, 無論是前端同學(xué)還是后端同學(xué), 應(yīng)該都對(duì)這個(gè)詞不陌生,跨站請(qǐng)求偽造
laravel 中為了解決CSRF
這個(gè)隱患, 默認(rèn)有保護(hù)機(jī)制, 我們需要配置CSRF 白名單
, 根據(jù)文檔, 我們知道CSRF 白名單
的配置在VerifyCsrfToken
中間件里,VerifyCsrfToken
中間件所在路徑:
App/Http/Middleware/VerifyCsrfToken.php
打開文件, 添加CSRF 白名單
,
protected $except = [ 'http://test.lara.com/test/queryUsers', ];
完成這步后我們?cè)俅蜷_ postman, 點(diǎn)擊send
可以看到數(shù)據(jù)如期望返回:
c. 現(xiàn)在我們來解析上面路由的第3條:
Route::get('test/queryUsers/{id}',['uses' => 'TestController@queryUsers']);
可以看出這條路由的區(qū)別在于路由末尾的{id}
, 開發(fā)中我們會(huì)有這樣的需求, 前端傳遞一個(gè)用戶id, 后端返回這個(gè)id對(duì)應(yīng)的該用戶信息
此時(shí)需要修改下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(路由傳遞的值)的記錄,
查看結(jié)果, 符合預(yù)期:
d. 現(xiàn)在我們來解析上面路由的第4條和第5條:
Route::match(['get','post'],'test/queryUsers',['uses' => 'TestController@queryUsers']); Route::any('test/queryUsers',['uses' => 'TestController@queryUsers']);
這倆路由我就不演示了, 分別解釋一下,match
里路由為指定的請(qǐng)求方式, 一種或多種,
而any
則是匹配任意方式, 無論是通過get
還是post
方式請(qǐng)求, 都能得到我們想要的結(jié)果.
我們?cè)倏纯瓷厦嫖以O(shè)計(jì)的goods表
我們能看到這兩條數(shù)據(jù)不知道創(chuàng)建的用戶是誰, 但是有uid值, 這時(shí)候我們希望一個(gè)接口既返回商品信息又能夠讓我知道創(chuàng)建者是誰, 此時(shí)就需要用到多表聯(lián)查了, 我們新增一個(gè)路由:
Route::get('test/queryGoods',['uses' => 'TestController@queryGoods']);
然后TestController
里新增一個(gè)queryGoods
方法:
public function queryGoods() { $goods = DB::table('goods') ->leftJoin('user', 'goods.uid', '=', 'user.id') ->get(); return json_encode($goods); }
如期望一樣返回?cái)?shù)據(jù):
[{ id: 1, uid: 1, name: "測(cè)試商品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: "測(cè)試商品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 } ]
但是用戶信息所有字段全部被返回了, 有些時(shí)候我們?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); }
關(guān)注下這行代碼:
select('goods.*', 'user.real_name', 'user.head_url')
這行代碼表示返回goods表中的所有字段
以及user表中的real_name
和head_url
字段, 就完美達(dá)到了我們想要的結(jié)果.
新增
至此查詢已經(jīng)基本寫的差不多了, 我們開始向數(shù)據(jù)表里新增
數(shù)據(jù)
我們新增一個(gè)post
請(qǐng)求的路由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
里新增一個(gè)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":"小菲菲"}
點(diǎn)擊send, 發(fā)現(xiàn)數(shù)據(jù)如期望一樣正確插入.
查詢構(gòu)造器提供insert
方法用于插入記錄到數(shù)據(jù)庫中。 insert 方法接收數(shù)組形式的字段名和字段值進(jìn)行插入操作
DB::table('user')->insert( ['real_name' => $real_name, 'nickname' => $nickname] );
編輯
我們新增一個(gè)put
請(qǐng)求的路由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
里新增一個(gè)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 里添加請(qǐng)求參數(shù):
{"id":"4", "nickname": "小阿菲~"}
點(diǎn)擊send, 發(fā)現(xiàn)數(shù)據(jù)如期望一樣正確更新.
查詢構(gòu)造器提供update
方法用于更新已有的記錄。 接受包含要更新的字段及值的數(shù)組
->where('id', $id)->->update(['nickname' => $nickname]);
刪除
我們新增一個(gè)delete
請(qǐng)求的路由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
里新增一個(gè)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
來刪除它, 添加請(qǐng)求參數(shù):
{"id":"4"}
點(diǎn)擊send, 發(fā)現(xiàn)數(shù)據(jù)如期望一樣正確刪除 (已經(jīng)沒有id為4的記錄).
laravel中查詢構(gòu)造器可以使用delete
方法從表中刪除記錄。添加where
子句來約束 delete 的條件:
->where('id', $id)->delete();
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。
分享標(biāo)題:如何在Laravel中利用查詢構(gòu)造器實(shí)現(xiàn)一個(gè)增刪改查功能-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://vcdvsql.cn/article0/deoooo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、標(biāo)簽優(yōu)化、品牌網(wǎng)站制作、小程序開發(fā)、外貿(mào)建站、全網(wǎng)營(yíng)銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容