1. 程式人生 > >Laravel操作資料庫的三種方式總結歸納

Laravel操作資料庫的三種方式總結歸納

國慶這幾天都在外面浪,馬上要上班了,該收心了,趁今天有些空閒的時間,靜下心總結下Laravel操作資料庫的三種方式,以作資料和參考:(三種方式:DB façade 、 查詢構造器、 Eloquent ORM )

目錄

一、使用DB façade(原始查詢)操作資料庫

二、使用查詢構造器操作資料庫(核心)(重要)

三、Eloquent ORM操作資料庫


詳細目錄結構:

一、使用DB façade(原始查詢)操作資料庫

(1)基本的資料庫操作路由配置

(2)資料庫façade操作模型StudentController建立

二、使用查詢構造器操作資料庫(核心)(重要)

(1)新增資料 

2-1-1. 新增資料返回布林值

2-1-2. 新增資料返回ID

2-1-3. 新增多條資料

(2)修改資料

2-2-1. *常用修改資料方式

2-2-2. 自增自減修改資料方式

(3)修改資料

(4)查詢資料(first()、where()、pluck()、select()、chunk())

(5)內建的聚合函式

三、Eloquent ORM操作資料庫

(1)Eloquent ORM模型的建立及查詢資料

(2)Eloquent ORM中新增資料、自定義時間戳、批量賦值

(3)Eloquent ORM修改資料

(4)Eloquent ORM 刪除資料

 

一、使用DB façade(原始查詢)操作資料庫

(1)基本的資料庫操作路由配置:

//新增資料
Route::get('student/add/{name?}/{age?}',['uses' => '[email protected]'])->where(['name' => '^[\x{4e00}-\x{9fa5}_a-zA-Z0-9]+$','age' => '\d+']);

//修改資料
Route::get('student/update/{id?}/{name?}',['uses' => '
[email protected]
'])->where(['id' => '\d+','name' => '^[\x{4e00}-\x{9fa5}_a-zA-Z0-9]+$']); //刪除資料 Route::get('student/delete/{id}',['uses' => '[email protected]'])->where(['id'=>'\d+']); //查詢資料 Route::get('student/find',['uses' => '[email protected]']);

(2)資料庫façade操作模型StudentController建立(app\Http\Controllers\StudentController.php)

namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\DB;

class StudentController extends Controller
{   
    /**
     * [新增資料]
     * @param  string  $name [新增姓名]
     * @param  integer $age  [新增年齡]
     * @return [Boolean]     [新增情況]
     */
    public function addStudentInfo($name = '我的女神',$age = 16){

        $insertBoolean = DB::insert('insert into student(name, age) values(?, ?)',[$name,$age]);

        return var_dump($insertBoolean); //bool(true)
    }

    /**
     * [修改資料]
     * @param  integer $id   [要修改的ID]
     * @param  string  $name [要修改成的姓名]
     * @return [int]         [修改的行數]
     */
    public function updateStudentInfo($id = 1002,$name = '放牛娃的春天'){

        $updateRows = DB::update('update student set name = ? where id = ?',[$name,$id]);

        return var_dump($updateRows); //int(1)
    }

    /**
     * [刪除資料]
     * @param  [type] $id [要刪除行的ID]
     * @return [int]      [刪除的行數]
     */
    public function deleteStudentInfo($id){

        $deleteRows = DB::delete('delete from student where id = ?',[$id]);

        return $deleteRows; //int(1)
    }

    /**
     * [查詢資料]
     * @return [array] [查詢資料的陣列集合]
     */
    public function findStudentInfo(){

        $doc = DB::select('select * from student');

        return dd($doc); //除錯模式dd()
    }
}


二、使用查詢構造器操作資料庫(核心)(重要)

簡介:Laravel查詢構造器(query builder)提供方便、流暢的介面,用來建立及執行資料庫查詢語法;其使用PDO引數繫結,以保護應用程式免於SQL注入因此傳入的引數不需額外轉義特殊字元(詳細瞭解PDO引數繫結,請參考:https://www.jianshu.com/p/f432fee5d901  )

(1)新增資料

1-1.新增資料返回布林值

/**
 * [使用查詢構造器新增資料]
 * @param  string  $name [新增的姓名]
 * @param  integer $age  [新增的年齡]
 * @return [boolean]     [新增是否成功]
 */
public function queryAdd($name = '王小二的女朋友',$age = 23){

    $addBool = DB::table('student')->insertGetId([
        'name' => $name,
        'age' => $age
    ]);

    return var_dump($addBool); //int(1009)   
}

1-2.新增資料返回ID

/**
 * [使用查詢構造器新增資料]
 * @param  string  $name [新增的姓名]
 * @param  integer $age  [新增的年齡]
 * @return [int]     [新增的ID]
 */
public function queryAdd($name = '王小二的女朋友',$age = 23){

    $addId = DB::table('student')->insertGetId([
        'name' => $name,
        'age' => $age
    ]);

    return var_dump($addId); //int(1009)   
}

1-3.新增多條資料

/**
 * [使用查詢構造器新增多條資料]
 * @return [boolean]     [新增是否成功]
 */
public function queryAddMore(){

    $addBool = DB::table('student')->insert([
        ['name' => '趙雲', 'age' => 32],
        ['name' => '張飛', 'age' => 35],
        ['name' => '周瑜', 'age' => 28],
        ['name' => '黃蓋', 'age' => 36]
    ]);

    return var_dump($addBool); // bool(true)
}

(2)修改資料

2-1. *常用修改資料方式:

/**
 * [使用查詢構造器更新資料]
 * @param  integer $id   [要更新的ID]
 * @param  string  $name [要更新的姓名]
 * @return [int]        [更新的行數]
 */
public function queryUpdate($id = 1007,$name = '放牧的星星'){
    
    $updateRows = DB::table('student')->where('id', $id)->update(['name' => $name]);

    return var_dump($updateRows); //int(1)
}

2-2. 自增自減修改資料方式:

(3)刪除資料

/**
 * [使用查詢構造器刪除資料]
 * @param  [int] $id [要刪除項的ID]
 * @return [int]     [刪除的行數]
 */
public function queryDelete($id){
    
    $deleteRows = DB::table('student')->where(['id' => $id])->delete();
    
    // 刪除總表 ( 不建議使用 )
    // DB::table('student')->truncate(); 

    return var_dump($deleteRows); // int(1)
}

(4)查詢資料( get()、 first() 、 where() 、 pluck() 、 lists()[新版本已棄用] 、 select() 、 chunk() )

/**
 * [查詢構造器查詢資料]
 */
public function queryFind(){

    //1. first方法使用,查詢制定順序的第一個(預設升序asc)
    /*$doc = DB::table('student')->orderBy('id','asc')->first();
    print_r($doc); 列印:stdClass Object ( [id] => 1003 [name] => 大黃蜂 [age] => 18 [sex] => 10 [created_at] => 0 [updated_at] => 0 )*/

    //2. where使用 ( 查詢ID小於1005的所有資料 )
    /*2-1. $doc = DB::table('student')->where('id','<',1005)->get();         
    2-2. $doc = DB::table('student')->whereRaw('id > ? and age < ?',[1001,20])->get();*/
    
    //3. pluck方法使用 ( 返回對應欄位的列的陣列 )
    /* $doc = DB::table('student')->where('age','>=',30)->pluck('name','id');
    print_r($doc); //列印: Illuminate\Support\Collection Object ( [items:protected] => Array ( [0] => 趙雲 [1] => 張飛 [2] => 黃蓋 ) )*/
        

    //4. lists方法的使用 ( 返回對應欄位的key-value陣列,類似於上面的pluck方法 ) [注意新版本Laravel已經棄用該lists方法]
    // $doc = DB::table('student')->where('age','>=',30)->lists('name','id');

    //5. select方法的使用 (返回對應欄位的資料列表)
    /*$doc = DB::table('student')->where('id','<=','1004')->select('name','age','id')->get();
    print_r($doc); //列印: Illuminate\Support\Collection Object ( [items:protected] => Array ( [0] => stdClass Object ( [name] => 大黃蜂 [age] => 18 [id] => 1003 ) [1] => stdClass Object ( [name] => 我的女神 [age] => 16 [id] => 1004 ) ) )*/

    // 6. chunk方法的使用 ( 分段查詢 )
    /*DB::table('student')->orderBy('id','desc')->chunk(2,function($result){
        dd($result);
    });*/

    //dd($doc);
    //return var_dump($doc);
}

(5)內建的聚合函式

  常用:count()、max()、min()、avg()、sum()

 /**
 * [查詢構造器聚合函式]
 */
public function queryFunc(){

    $count = DB::table('student')->count();
    echo $count; // 11

    $max = DB::table('student')->max('age');
    echo $max; //36

    $avg = DB::table('student')->avg('age');
    echo $avg; //21.0909

    $sum = DB::table('student')->sum('age');
    echo $sum; //232
}

三、Eloquent ORM操作資料庫

概述:

1.Eloquent ORM模型的建立及查詢資料

/**
 * [ORM操作資料庫查詢資料]
 * @return [type] [資料集合]
 */
public function eloquentORM(){
    
    //1. 查詢所有資料
    $results1 = Student::all();
    $results1 = Student::get();
    
    //2. 根據主鍵查詢其中某條資料
    $results2 = Student::find(1001);
    
    //3. 根據主鍵查詢/如果沒查到報錯
    $results3 = Student::findOrFail(1007);
    
    //4. 帶條件查詢
    $results4 = Student::where('id','>',1008)->orderBy('age','desc')->get();

    //5. 分段查詢
    Student::chunk(2,function($results5){});

    //6. 聚合函式使用
    $count = Student::sum('age');
    
}

2.Eloquent ORM中新增資料、自定義時間戳、批量賦值

/**
 * [使用ORM新增資料]
 * @return [object] [新增的資料項]
 */
public function eloquentORMAdd(){

   /* $student = new Student();
    $student->name = '叮咚叮咚的小溪';
    $student->age = 12;
    $s = $student->save();

    dd($student);*/

    //2. 使用模型的Create方法新增資料 ( 報錯:需要在Student模型中新增:protected $fillable = ['name','age']; )
    /*$result = Student::create(
        ['name' => '兩隻吵架的小英短','age' => 1]
    );

    dd($result);*/

    // 3. firstOrCreate() 查詢,無則新增,返回新的例項物件
    /*$result = Student::firstOrCreate(
        ['name' => '張飛']
    );
    dd($result);*/

    // 4. firstOrNew() 查詢,無則新增,新增需要save,返回新的例項
    /*$result = Student::firstOrNew(
        ['name' => '共燒茄子拌豆腐','age' => 12]
    );
    $result -> save();
    dd($result);*/
}

3.Eloquent ORM修改資料

/**
 * [使用ORM更新資料]
 */
public function eloquentORMUpdate(){

    //1. 通過模型更新
    /*$student = Student::find(1017);
    $student->name = '紅色小短裙的胖胖豬';
    $student->age = 8;
    $bool = $student->save();

    dd($bool);*/ //true //報錯: Call to a member function format() on string 解決:Student模型中關閉方法asDateTime
    
    //2. 通過結合查詢語句 批量更新

    $rowNum = Student::where('id','>',1022)->update(
        ['age' => 32]
    );

    var_dump($rowNum); //int(1)
}

 

4.Eloquent ORM 刪除資料

/**
 * [eloquentORMDelete description]
 * @return [type] [description]
 */
public function eloquentORMDelete(){

    //1. 通過模型刪除
   /* $student = Student::find(1016);
    $bool = $student->delete();
    var_dump($bool); //bool(true)*/

    //2. 通過主鍵值刪除
    /*$numRow = Student::destroy(1022, 1018);
    var_dump($numRow); //int(1)*/

    //3. 通過指定條件刪除
   /* $numRow = Student::where('id','>',1013)->delete();
    var_dump($numRow); //int(7)*/

}

 

 ~~  致自己:不要失去信心,只要堅持不懈,就終會有成果的!