1. 程式人生 > >Laravel基礎篇學習筆記(二):資料庫操作

Laravel基礎篇學習筆記(二):資料庫操作

1)DB facade(原始查詢)

a)連線資料庫;

配置資料庫在目錄 laravel/config/database.php
'default' => env('DB_CONNECTION', 'mysql'),

//預設配置為mysql,因此檢視connections裡對應的mysql項
'mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'localhost'),
    'database'  => env('DB_DATABASE', 'forge'
), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, 'engine' => null, ], // 這裡的env指的是 laravel/.env,配置內容為: DB_HOST=127.0
.0.1 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=root

b)使用DB facade實現CURD;

// 使用 DB 類操作資料庫,必須呼叫 DB facade 類
use Illuminate\Support\Facades\DB;

// 新增
$bool = DB::insert('insert into student(name,age) values(?, ?)',
    ['imooc', 18]);
var_dump($bool);

// 更新
$num = DB::update('update student set age = ? where name = ?'
, [20, 'sean']); var_dump($num); // 查詢 $students = DB::select('select * from student where id = ?', [1001]); dd($students); // 刪除 $num = DB::delete('delete from student where id > ?', [1001]); var_dump($num);

2)查詢構造器

a)查詢構造器簡介及新增資料

// 新增一條資料,並獲取其ID值
$id = DB::table('student')->insertGetId(
    ['name' => 'vision', 'age' => 18]
);
var_dump($id);

// 新增多條資料,返回布林值表明執行成功或失敗
$bool = DB::table('student')->insert([
    ['name' => 'name1', 'age' => 20],
    ['name' => 'name2', 'age' => 21],
]);
var_dump($bool);

b)使用查詢構造器更新資料

// 查詢構造器更新資料,返回修改的數量
$num = DB::table('student')
   ->where('id', 1002)
   ->update(['age' => 30]);

// 不加條件預設所有自增自減一,返回修改的數量
$num = DB::table('student')->increment('age');     //自增
$num = DB::table('student')->decrement('age');     //自減

// 加上條件自增自減,返回修改的數量
$num = DB::table('student')->increment('age', 3);
$num = DB::table('student')->decrement('age', 3);

// 把id為1002的age欄位自減3,並把name欄位改為iimooc,返回修改的數量
$num = DB::table('student')
   ->where('id', 1002)
   ->decrement('age', 3, ['name' => 'iimooc']);

c)使用查詢構造器刪除資料

// 刪除ID為1007的資料,返回修改的數量
$num = DB::table('student')
    ->where('id', 1007)
    ->delete();

// 刪除ID大於等於1005的資料,返回修改的數量
$num = DB::table('student')
    ->where('id', '>=', 1005)
    ->delete();

// 清空表資料,無返回資料
DB::table('student')->truncate();

d)使用查詢構造器查詢資料

get() 獲取所有資料

$students = DB::table('student')->get();

first() 獲取第一條資料

$student = DB::table('student')
    ->orderBy('id', 'desc')
    ->first();

where() 新增查詢條件

$students = DB::table('student')
    ->where('id', '>=', 1002)
    ->get();

whereRaw() 多個查詢條件

$students = DB::table('student')
    ->whereRaw('id >= ? and age > ?', [1001, 18])
    ->get();

pluck() 結果集中指定的欄位

$names = DB::table('student')
    ->pluck('name');

lists() 結果集中指定的欄位

$names = DB::table('student')
    ->lists('name');
// 查詢結果如下
array:5 [▼
  0 => "name1"
  1 => "name2"
  2 => "name3"
  3 => "name4"
  4 => "name5"
]

// 指定ID作為下標
$names = DB::table('student')
    ->lists('name', 'id');
// 查詢結果如下
array:5 [▼
  1001 => "name1"
  1002 => "name2"
  1003 => "name3"
  1004 => "name4"
  1005 => "name5"
]

select() 選擇指定欄位進行查詢

$students = DB::table('student')
    ->select('id', 'name', 'age')
    ->get();

chunk() 每次查詢兩條資料,直到結束

echo "<pre>";
DB::table('student')->chunk(2, function($students) {

    var_dump($students);

    // if(你的條件) {
    //     return false; // 在特定條件下執行可以使查詢停止
    // }

});

e)查詢構造器中的聚合函式

// 統計表的記錄數
$num = DB::table('student')->count();

// 計算最大值
$max = DB::table('student')->max('age');

// 計算最小值
$min = DB::table('student')->min('age');

// 計算平均數
$avg = DB::table('student')->avg('age');

// 計算和
$sum = DB::table('student')->sum('age');

3)Eloquent ORM

a)Eloquent ORM簡介、模型的建立及查詢資料

建立模型檔案 laravel/app/Student.php

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
    // 指定表名
    protected $table = 'student';
    // 指定id
    protected $primaryKey = 'id';
}

控制器路徑 laravel/app/Http/Controllers/StudentController.php

// 記住需要呼叫該模型
use App\Student;



// all() 查詢表裡所有資料
$students = Student::all();

// find() 查詢指定ID
$students = Student::find(1001);

// findOrFail()     findOrFail() 失敗會報錯,find() 會返回null
$students = Student::findOrFail(1006);



// 使用查詢構造器的方法也可查詢資料
$students = Student::get();
$students = Student::where('id', '>', '1001')
    ->orderBy('age', 'desc')
    ->first();
echo "<pre>";
Student::chunk(2, function($students) {
    var_dump($students);
});

// 聚合函式
$num = Student::count();
$max = Student::where('id', '>', 1001)->max('age');
var_dump($max);

b)Eloquent ORM中新增資料、自定義時間戳及批量賦值的使用

控制器路徑 laravel/app/Http/Controllers/StudentController.php
有部分功能需要在模型檔案開啟才能夠使用

// 1. 使用模型新增資料
$student = new Student();
$student->name = 'sean2';
$student->age = 20;
$bool = $student->save();


// 2. 使用模型查詢指定欄位(參照模型檔案設定2)
$student = Student::find(1015);
echo $student->created_at . "<br />";
echo date('Y:m:d H:i:s', $student->created_at);


// 3. 使用模型的Create方法新增資料(參照模型檔案設定3)
$student = Student::create(
    ['id' => '1', 'name' => 'imddooc', 'age' => 18, 'sex' => '5']
);
//此處因沒有設定id,sex欄位,插入資料不會賦值
dd($student);


// 4. firstOrCreate() 有匹配的,就不新增,沒有則新增資料
$student = Student::firstOrCreate(
    ['name' => '555']
);


// 5. firstOrNew()   以屬性查詢使用者,如果沒有則建立新的例項,需要儲存自己呼叫save
$student = Student::firstOrNew(
    ['name' => '5555']
);
$bool = $student->save();

模型檔案 laravel/app/Student.php

// 2. 設定自動維護時間戳,會幫我們把欄位created_at和updated_at的時間新增進去;
// 預設開啟,設定成false則關閉
public $timestamps = true;

// 設定created_at和updated_at的時間形式,預設為當前年份,如“2017”;設定getdateFormat可實現顯示時間戳
protected function getdateFormat()
{
    return time();
}

// 預設輸出created_at和updated_at時,會自動格式化時間;設定asDateTime可以實現直接輸出
protected function asDateTime($val)
{
    return $val;
}


// 3. 指定允許批量賦值的欄位,只有這樣才能讓create方法成功,沒有設定則按預設的來
protected $fillable = ['name', 'age'];

// 指定不允許批量賦值的欄位
protected $guarded = [];

c)使用Eloquent ORM修改資料

// 通過模型更新資料
$student = Student::find(1021);
$student->name = 'kitty';
$bool = $student->save();       // 會修改name和updated_at欄位
var_dump($bool);


// 結合查詢語句批量更新
$num = Student::where('id', '>', 1020)->update(
    ['age' => 41]
);
var_dump($num);

d)使用Eloquent ORM刪除資料

// 通過模型刪除;刪除時如果沒有該資料會報錯
$student = Student::find(1021);
$bool = $student->delete();
var_dump($student);


// 通過主鍵刪除;刪除時沒有該資料返回int(0)
$num = Student::destroy(1022);
$num = Student::destroy(1024,1025);
$num = Student::destroy([1019,1020]);
var_dump($num);


// 刪除指定條件的資料
$num = Student::where('id', '>', 1015)->delete();
var_dump($num);