三種操做數據庫的方式。php
Ref: 解讀Laravel,看PHP如何實現Facade?css
Facade本質上是一個「把工做推給別人作的」的類。html
Facade存在的價值,能夠從服務容器談起。服務容器,可見個人另外一篇博文,地址:http://www.cnblogs.com/sweng/p/6430374.htmljava
舉個例子,不知道你們之前寫代碼有沒有過obj->method(arg1,arg2)->func(arg3,arg4);的體驗。學過服務容器的讀者知道,這行代碼就是把服務容器裏的對象取出來,並調用他的方法。這對熟悉服務容器裏註冊過哪些類的開發人員來講,這種代碼仍是能夠接受的。可是若是像路由定義那樣,也要寫成這樣冗長的形式,實在太不優雅了。因此用Facade模式能夠很好的精簡代碼長度。mysql
涉及的文件以下,填寫好配置文件便可鏈接成功。laravel
config/database.php .env
[config/database.php]程序員
'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', ], 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ],
填寫四個屬性:DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORDsql
APP_NAME=Laravel APP_ENV=local APP_KEY=base64:qddbSfYhoK3ZKyRQSo4effaeR9ABBIwmA7GoyF3gQjg= APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret BROADCAST_DRIVER=log CACHE_DRIVER=file SESSION_DRIVER=file SESSION_LIFETIME=120 QUEUE_DRIVER=sync REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
Controller中添加函數鏈接mySql。 數據庫
Ref: Laravel查詢構造器簡介express
Ref: 查詢構造器-示例文檔
其實就是更爲安全地操做數據庫的方式,具體有三方面的好處:
(1) Laravel查詢構造器(query builder)提供方便、流暢的接口,用來創建及執行數據庫查找語法
(2) 使用PDO參數綁定,以保護應用程序免於SQL注入。所以傳入的參數不需額外轉義特殊字符
(3) 基本能夠知足全部的數據庫操做,並且在全部支持的數據庫系統上均可以執行
在 Controller 中,添加路由以及對應的映射方法。
[routes.php]
Route::any('query1', ['uses' => 'StudentController@query1']);
[app/Http/Controllers/StudentController.php]
public function query1() { $bool = DB:table('student')->insert( ['name' => 'imnoc', 'age' => 18] ); var_dump($bool): }
Next 涉及到以下內容,具體請見相關連接內容。
Ref: ORM框架使用優缺點
對象關係映射(Object Relational Mapping,簡稱ORM),主要實現程序對象到關係數據庫數據的映射。
A . 簡單:ORM以最基本的形式建模數據。好比ORM會將MySQL的一張表映射成一個Java類(模型),表的字段就是這個類的成員變量
B . 精確:ORM使全部的MySQL數據表都按照統一的標準精確地映射成java類,使系統在代碼層面保持準確統一
C . 易懂:ORM使數據庫結構文檔化。好比MySQL數據庫就被ORM轉換爲了java程序員能夠讀懂的java類,java程序員能夠只把注意力放在他擅長的java層面(固然可以熟練掌握MySQL更好)
D . 易用:ORM包含對持久類對象進行CRUD操做的API,例如create(), update(), save(), load(), find(), find_all(), where()等,也就是講sql查詢所有封裝成了編程語言中的函數,經過函數的鏈式組合生成最終的SQL語句。經過這種封裝避免了不規範、冗餘、風格不統一的SQL語句,能夠避免不少人爲Bug,方便編碼風格的統一和後期維護。
好比有一個表:Student
[app/Student.php]
思路:routes.php --> StudentController.php --> Student.php [orm model]
[StudentController.php]
public function orm1() { $stduents = Student::all(); // --> 調用了咱們本身創建的ORM模型
$students = Student::find(1001); // --> 返回id:1001的數據
$students = Student::findOrFail(1006); // --> 查不到就報錯
# 查詢構造器方法
$students = Student::get()
$stduent = Student::where('id', '>', '1001') // 與find很像
->orderBy('age', 'desc')
->first();
echo '<pre>';
Student::chunk(2, function($students) {
var_dump($stduents);
});
# 聚合函數
$num = Student::count();
$max = Student::where('id', '>', 1001)->max('age');
dd($students); // 打印格式更好
var_dump($student); }
如此,看上去貌似更爲人性化。
DB主要是一個查詢構造器(SQLBuilder),它會幫你把輸入的參數轉變成SQL語句去數據庫裏查詢,和你本身手動寫SQL語句本質上是同樣的。
ORM是一個對象關係映射(Object Relational Mapper)工具,它會把數據庫中的數據映射成對象和集合對象,你無需接觸底層數據,能夠直接調用映射出來的對象進行開發。
DB適合用於對性能要求高或者業務邏輯簡單的項目,ORM適合業務邏輯比較複雜的項目。
ORM模型中自帶的save()函數用於寫入數據庫。
ORM自動會維護,生成created_at, updated_at。
[1] 忽略時間戳,這裏設置爲false,則不會自動改變created_at以及updated_at。
[app/Student.php]
== 模型 ==
public $timestamps = true;
protected function getDateFormat()
{
return time();
}
proteacted function asDateTime($val)
{
return $val;
}
上述倆函數看樣子是重寫了方法,也便是父類Model中的方法,效果就是改變了時間相關的內容。
[2] 返回數據庫中的時間內容。
== 控制器 ==
$student = Student::find(1017);
echo $student->created_at; #已經格式化好了
echo date('Y-m-d H:i:s', $student->created_at); # 手動格式化好的時間
[1] 設置「批量賦值」的屬性
== 模型 ==
// 指定容許批量賦值的字段 protected $fillable = ['name', 'age']
// 不容許批量賦值的字段
protected $guarded = [...];
[2] 批量賦值。
== 控制器 ==
$student = Student::create(
['name' => 'imooc', 'age' => 18]
);
dd($student);
先查找,沒有則添加。
== 控制器 ==
$stduent = Student::firstOrCreate( ['name' => 'imooc'] }; dd($student);
先創建個對象,而後本身手動save寫入數據庫。
== 控制器 == $stduent = Student::firstOrNew( ['name' => 'imoocsss'] };
# 到此其實沒有寫入數據庫
$bool = $student->save(); dd($bool);
== 控制器 == $stduent = Student::find(1021);
$student->name = 'kitty';
$bool = $student->save();
var_dump($bool);
== 控制器 ==
# 這裏是查詢構造器的方式 $num = Student::where('id', '>', 1019)->update(
['age' => 41]
);
var_dump($num);
== 控制器 == $stduent = Student::find(1021);
$bool = $student->delete();
var_dump($bool);
== 控制器 == $num = Student::destroy(1018, 1019); // 這裏刪除兩條記錄
$num = Student::destroy([1018, 1019]); // 這裏刪除兩條記錄,數組法
var_dump($num);
== 控制器 == $num = Student::where('id', '>', 1004)->delete();var_dump($num);