摘要:同時(shí),傳入?yún)?shù),即已存在的查詢(xún)。因此,更為常見(jiàn)的做法是在控制器中處理路由請(qǐng)求。
這一節(jié),我們進(jìn)一步完善上一節(jié)創(chuàng)建的任務(wù)列表。主要知識(shí)點(diǎn):
Eloquent Model
控制器
路由模型綁定
Eloquent Model 新增遷移首先,我們?yōu)閿?shù)據(jù)庫(kù)表 tasks 新增一個(gè)字段 completed,用來(lái)表示任務(wù)是否完成:
$ php artisan make:migration add_completed_to_tasks_table --table=tasks
這次,我們使用 --table 指定已存在的表。接著添加具體字段:
// /database/migrations/2017_04_11_060132_add_completed_to_tasks_table.php public function up() { Schema::table("tasks", function (Blueprint $table) { $table->boolean("completed")->default(0); }); } public function down() { Schema::table("tasks", function (Blueprint $table) { $table->dropColumn("completed"); }); }
執(zhí)行遷移:
$ php artisan migrate
如果我們想要回滾本次遷移,可以執(zhí)行:
$ php artisan migrate:rollback
將會(huì)執(zhí)行遷移任務(wù)的 down() 函數(shù):
上手 Eloquent Model上一節(jié),我們使用 DB 來(lái)操縱數(shù)據(jù)庫(kù),在 Laravel 中,也叫做查詢(xún)構(gòu)造器。實(shí)際上,Laravel 提供了更為強(qiáng)大的用來(lái)與數(shù)據(jù)庫(kù)交互的工具:Eloquent Model。
首先,我們來(lái)創(chuàng)建一個(gè)與 tasks 表格對(duì)應(yīng)的 Model:
$ php artisan make:model Task
現(xiàn)在,我們就可以使用 Eloquent 了,啟動(dòng)控制臺(tái):
$ php artisan tinker
可以先對(duì) Task 類(lèi)實(shí)例化,然后再進(jìn)行各種操作:
>>> $task = new AppTask; # 新建一個(gè) Task 實(shí)例
新建任務(wù):
>>> $task->name = "新的任務(wù)" >>> $task->completed = 1 >>> $task->save() # 保存新實(shí)例 >>> $task => AppTask {#674 name: "新的任務(wù)", completed: 1, updated_at: "2017-04-11 06:14:10", created_at: "2017-04-11 06:14:10", id: 4, }
查詢(xún):
>>> $task->all()->toJson(); # 獲取數(shù)據(jù)并轉(zhuǎn)化為 json 格式 >>> $task->where("completed",1)->get(); # 查看完成的任務(wù) >>> $task->pluck("name")->first(); # 獲取第一條記錄的 name 字段
也可以不實(shí)例,直接調(diào)用「門(mén)面」方法來(lái)操作:
>>> AppTask::first(); # 獲取第一條記錄 >>> AppTask::latest()->get(); # 按先后順序顯示記錄自定義方法
剛才的例子中,有一行是用來(lái)查詢(xún)已完成的任務(wù)的:
>>> $task->where("completed",1)->get();
該查詢(xún)?cè)诤芏嗟胤蕉加锌赡芤玫剑瑸榱吮苊庵貜?fù)工作,我們將其封裝到 Model 中:
// /app/Task.php class Task extends Model { public function completed() { return static::where("completed",1)->get(); } public function unCompleted() { return static::where("completed",0)->get(); } }
我們定義了 completed() 和 unCompleted() 方法分別獲取已完成和未完成的任務(wù)?,F(xiàn)在,需要重新啟動(dòng) tinker:
>>> $task = new AppTask; >>> $task->completed(); >>> $task->uncompleted()->pluck("name");
那么,我們是否可以直接使用 `Task::completed()呢?當(dāng)然可以,不過(guò)需要把方法改成靜態(tài)的,因?yàn)殪o態(tài)方法可以通過(guò)類(lèi)和實(shí)例訪(fǎng)問(wèn):
public static function completed() { return static::where("completed",1)->get(); } public static function unCompleted() { return static::where("completed",1)->get(); }
這樣就可以通過(guò)類(lèi)直接訪(fǎng)問(wèn)了,依舊要重啟 tinker 才能生效
$ php artisan tinker >>> AppTask::completed() >>> AppTask::unComplete()
對(duì)于上述的方法,Laravel 提供了更為便利的方式實(shí)現(xiàn),叫做范圍查詢(xún):
public function scopeCompleted($query) { return $query->where("completed",1); } public function scopeUnCompleted($query) { return $query->where("completed",0); }
使用范圍查詢(xún),只需要在我們的方法前面加上 scope 就行,這樣就不用去定義靜態(tài)方法。同時(shí),傳入 $query 參數(shù),即已存在的查詢(xún)。我們只需要在此基礎(chǔ)上添加自己想要的查詢(xún)就可以了?,F(xiàn)在,可以方便的使用了:
$ php artisan tinker >>> use AppTask; >>> Task::completed()->get(); >>> Task::unCompleted()->pluck("name")
經(jīng)過(guò)對(duì) Eloquent 的初步學(xué)習(xí)之后,我們可以將之前的 DB 查詢(xún)換成 Eloquent 的:
// /routes/web.php completed()->get(); $unCompletedTasks = Task::latest()->unCompleted()->get(); return view("tasks/index",compact("completedTasks","unCompletedTasks")); }); Route::get("tasks/{task}", function($id) { $task = Task::findorFail($id); return view("tasks/show",compact("task")); });
對(duì)應(yīng)的視圖文件也稍微修改下:
// /resources/views/tasks/index.blade.php控制器任務(wù)列表
未完成
@foreach ($unCompletedTasks as $task)
- id]) }}">{{ $task->name }}
@endforeach已完成
@foreach ($completedTasks as $task)
- id]) }}">{{ $task->name }}
@endforeach
之前,我們都是直接在路由處理請(qǐng)求,看上去好像沒(méi)什么問(wèn)題。但是,如果當(dāng)網(wǎng)站規(guī)模大起來(lái)之后,將路由和業(yè)務(wù)處理放在一起會(huì)變得難以維護(hù)。因此,更為常見(jiàn)的做法是在控制器中處理路由請(qǐng)求。
創(chuàng)建控制器首先是控制器的創(chuàng)建:
$ php artisan make:controller TasksController
這樣就創(chuàng)建了一個(gè)空白的控制器了。
在控制器中處理請(qǐng)求接下來(lái),我們就可以在控制器中定義不同的方法來(lái)處理路由請(qǐng)求了。先在路由中指定請(qǐng)求由哪個(gè)控制器的方法處理:
Route::get("tasks","TasksController@index"); Route::get("tasks/{task}","TasksController@show");
控制器里面可以把剛才路由的方法拷貝進(jìn)來(lái):
// /app/Http/Controllers/TasksController.php completed()->get(); $unCompletedTasks = Task::latest()->unCompleted()->get(); return view("tasks/index",compact("completedTasks","unCompletedTasks")); } public function show($task) { $task = Task::findorFail($task); return view("tasks/show",compact("task")); } }路由模型綁定 自動(dòng)路由模型綁定
剛才的 show 方法,可以進(jìn)一步簡(jiǎn)寫(xiě)成:
// /app/Http/Controllers/TasksController.php public function show(Task $task) { return view("tasks/show",compact("task")); }
功能完全一樣,如果覺(jué)得好奇,可以打印出 $task
// /app/Http/Controllers/TasksController.php public function show(Task $task) { dd($task); }
你會(huì)發(fā)現(xiàn),此時(shí)的 $task 已經(jīng)不是參數(shù)值了,而是從數(shù)據(jù)庫(kù)返回的對(duì)應(yīng)實(shí)例。也就是說(shuō),我們?yōu)?$task 添加了類(lèi)型提示 Task 之后,Laravel 自動(dòng)幫我們進(jìn)行了查詢(xún)。這就叫做自動(dòng)路由模型綁定。
手動(dòng)路由模型綁定當(dāng)然,我們也可以手動(dòng)進(jìn)行綁定!比如我只想要顯示完成的任務(wù):
// /app/Providers/RouteServiceProvider.php public function boot() { parent::boot(); Route::bind("task",function($task){ return AppTask::completed()->findOrFail($task); }); }
然后訪(fǎng)問(wèn)未完成的任務(wù),比如 task/1,就會(huì)報(bào)錯(cuò)。
參考:
PHP: Static(靜態(tài))關(guān)鍵字 - Manual
Eloquent: 入門(mén) | Laravel 5.4 中文文檔
Laravel 5.2 Error "Missing argument 1 for IlluminateAuthAuthManager::createDriver()"
Laravel HTTP 路由功能 | Laravel 5.4 中文文檔
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22707.html
摘要:熟悉了路由與視圖的基本操作之后,我們來(lái)讓視圖顯示一個(gè)任務(wù)列表吧。創(chuàng)建遷移現(xiàn)在,我們就可以創(chuàng)建一個(gè)用來(lái)生成任務(wù)表的遷移了。 熟悉了路由與視圖的基本操作之后,我們來(lái)讓視圖顯示一個(gè)任務(wù)列表吧。主要知識(shí)點(diǎn): 數(shù)據(jù)遷移 查詢(xún)構(gòu)造器 數(shù)據(jù)庫(kù) 創(chuàng)建數(shù)據(jù)庫(kù) 首先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù): $ mysql -uroot -p mysql> create database laratasks; 數(shù)據(jù)庫(kù)配置 La...
摘要:為的輔助方法,用于截取字符串的前個(gè)字符,然后返回前個(gè)字符加的格式。顯示某篇文章顯示某篇文章的比較簡(jiǎn)單,路由注意要放在下面,假如這樣那么,我們?cè)L問(wèn)的時(shí)候,會(huì)被當(dāng)成是的查詢(xún)參數(shù)。 文章的顯示功能比較簡(jiǎn)單,分為兩部分: 文章列表 具體的某篇文章 顯示文章列表 路由之前已經(jīng)定義好: Route::get(/posts,PostsController@index); 控制器: public ...
摘要:接下來(lái)執(zhí)行遷移即可通用布局通用布局首先是博客首頁(yè),定義路由控制器視圖博客首頁(yè)訪(fǎng)問(wèn)下網(wǎng)站根目錄,顯示博客首頁(yè),框架基本搭建完成了。首先是通用布局通用布局里面除了使用之外,還使用了,用于加載其他模板。 5. 博客的通用布局 初始化 創(chuàng)建控制器、模型、遷移 博客的核心是文章,可以先來(lái)實(shí)現(xiàn)和文章有關(guān)的功能,根據(jù)前幾節(jié)的介紹可知,我們至少需要?jiǎng)?chuàng)建這幾類(lèi): PostsController:控制器...
摘要:本節(jié)將實(shí)現(xiàn)文章評(píng)論與用戶(hù)關(guān)聯(lián)的功能。關(guān)系定義首先修改與表,增加字段增加全部回滾并重新執(zhí)行遷移添加用戶(hù)表與文章表評(píng)論表的一對(duì)多關(guān)系添加文章評(píng)論表與用戶(hù)表的多對(duì)一關(guān)系同時(shí),評(píng)論表的字段增加。同時(shí),我們還自定義了返回的錯(cuò)誤信息。 本節(jié)將實(shí)現(xiàn)文章、評(píng)論與用戶(hù)關(guān)聯(lián)的功能。 關(guān)系定義 首先修改 posts 與 comments 表,增加 user_id 字段 /database/migratio...
摘要:但是服務(wù)通常由服務(wù)提供者來(lái)管理的。小結(jié)通過(guò)上述的例子,基本上可以理解服務(wù)容器和服務(wù)提供者的使用。懂得了服務(wù)容器和服務(wù)提供者,理解門(mén)面也就不難了。 自動(dòng)依賴(lài)注入 什么是依賴(lài)注入,用大白話(huà)將通過(guò)類(lèi)型提示的方式向函數(shù)傳遞參數(shù)。 實(shí)例 1 首先,定義一個(gè)類(lèi): /routes/web.php class Bar {} 假如我們?cè)谄渌胤揭褂玫?Bar 提供的功能(服務(wù)),怎么辦,直接傳入?yún)?shù)即...
閱讀 3623·2021-11-24 10:19
閱讀 3754·2021-09-30 09:47
閱讀 1319·2019-08-30 15:56
閱讀 822·2019-08-29 15:11
閱讀 929·2019-08-29 13:43
閱讀 3611·2019-08-28 18:25
閱讀 2180·2019-08-26 13:27
閱讀 1457·2019-08-26 11:44