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