1. 程式人生 > 其它 >Laravel—資料庫操作與Eloquent模型使用總結

Laravel—資料庫操作與Eloquent模型使用總結

資料庫操作
執行原生SQL
//查詢
$emp = DB::select('select * from employees where emp_no = 1');
$emp = DB::select('select * from employees where emp_no = ? and gender = ?',[1,'M']);
$emp = DB::select('select * from employees where emp_no = :empNo and gender = :gender',['empNo'=>1,'gender'=>'M']);

//插入
DB::insert('
insert into employees(first_name,last_name) values(?,?,?)',['Jack','Ma']); //更新,返回受影響的行數 $affected = DB::update('update employees set gender = ? where emp_no = ?',['M',123]); //刪除,返回被刪除的行數 $deleted = DB::delete('delete from employees where first_name = ?',['Jack']); //執行通用語句,不返回任何值 DB::statement('drop table employees
'); 事務 //如果事務閉包中丟擲異常,事務將會自動回滾;如果閉包執行成功,事務將會自動提交: DB::transaction(function(){ DB::insert('insert into employees(first_name,last_name) values(?,?,?)',['Jack','Ma']); $affected = DB::update('update employees set gender = ? where emp_no = ?',['M',123]); }); //手動開啟事務 DB::beginTransaction(); //手動回滾 DB::rollBack();
//手動提交 DB::commit(); 查詢構建器 table() 通過DB門面的table()函式來獲取一個查詢構建器例項。 get() $emps = DB::table('employees').get(); 1 返回包含結果集額的Illuminate\Support\Collection,其中每一個結果都是 PHP 的 StdClass 物件例項 first() $emp = DB::table('employees')->first(); 1 從資料表中獲取一行資料 value() $values = DB::table('employees')->where('emp_no','>=',499995)->value('first_name'); 1 只獲取第一條結果的某一列的資料 pluck() 與value類似,但是返回所有符合條件的記錄列陣列。 chunk() DB::table('employees')->where('emp_no','>=',499980)->orderby('emp_no')->chunk(10,function($emps){ foreach ($emps as $emp) { echo $emp->first_name. '<br>'; } }); 1 2 3 4 5 將查詢結果分塊在回撥函式中進行處理。 聚合函式 //count() $result = DB::table('employees')->where('emp_no','>=',499980)->count(); //max() $result = DB::table('salaries')->max('salary'); //min() $result = DB::table('salaries')->min('salary'); //sum() $result = DB::table('salaries')->where('emp_no','>=',499980)->sum('salary'); //avg() $result = DB::table('salaries')->where('emp_no','>=',499980)->avg('salary'); exists()、doesntExist $result = DB::table('employees')->where('emp_no','=','500000')->exists(); $result = DB::table('employees')->where('emp_no','=','500000')->doesntExist(); 判斷結果是否存在或不存在 select(),andSelect() $result = DB::table('employees')->where('emp_no','>=','499980')->select('first_name','last_name')->get(); //上面的查詢等同於: $query = DB::table('employees')->where('emp_no','>=','499980')->select('first_name'); $result = $query->andSelect('last_name')->get(); 指定查詢的列 distinct() $result = DB::table('employees')->where('emp_no','>=','499980')->select('first_name','last_name')->distinct()->get(); 1 過濾重複結果 原生語句 DB::Raw() $result = DB::table('employees')->select(DB::raw('count(1) as num'))->where('emp_no','>=', 499980')->get(); 1 whereRaw() $result = DB::table('employees')->select(DB::raw('count(1) as num'))->whereRaw('emp_no>=?',[499980])->get(); 1 此外還有orWhereRaw(),havingRaw(),orhavingRaw(),orderByRaw() Join join $result = DB::table('employees')->join('salaries','employees.emp_no','=','salaries.emp_no')->where('employees.emp_no','>=','499980')->get(); 1 leftJoin,rightJoin類似。 crossJoin():生成一個笛卡爾積 $users = DB::table('sizes') ->crossJoin('colours') ->get(); 1 2 3 高階連線 $result = DB::table('employees')->join('salaries',function($join){ $join->on('employees.emp_no','=','salaries.emp_no')->where('employees.emp_no','>=','499980'); })->get(); join函式的第二個引數為一個閉包,該閉包將會接收一個 JoinClause 物件用於指定 join 子句約束。 子查詢連線 $salaryQ = DB::table('salaries')->where('emp_no','>=','499980'); $result = DB::table('employees')->joinSub($salaryQ,'salaries',function($join){ $join->on('employees.emp_no','=','salaries.emp_no'); })->get(); return $result; 可以使用 joinSub、leftJoinSub 和 rightJoinSub 方法將查詢和一個子查詢進行連線,每個方法都接收三個引數 —— 子查詢、表別名和定義關聯欄位的閉包 Union $emps = DB::table('employees')->whereRaw('emp_no between 499980 and 499990'); $result = DB::table('employees')->whereRaw('emp_no > 499990')->union($emps1)->get(); Where 子句 簡單where子句 //新增一個條件 DB::table('employees')->where('emp_no','>=','499980'); //新增多個條件,傳二維陣列 DB::table('employees')->where([ ['emp_no','>=','499980'], ['gender','=','F'] ]); or語句 DB::table('employees')->where('emp_no','>=','499980')->orWhere('emp_no','<','10')->get(); 1 whereBetween DB::table('employees')->whereBetween('emp_no',[499980,499999])->get(); 1 whereNotBetween同理 whereIn,whereNotIn DB::table('employees')->whereIn('emp_no',[11111,11112,11113])->get(); 1 whereNotIn同理 whereNull,whereNotNull DB::table('employees')->whereNull('birth_date')->get(); 1 wherNotNull同理 whereDate / whereMonth / whereDay / whereYear / whereTime orderBy() $result = DB::table('employees')->whereIn('emp_no',[11111,11112,11113])->orderBy('hire_date','asc','birth_date','asc')->get(); 1 groupBy(),having DB::table('salaries')->select('emp_no','salary')->groupBy('emp_no','salary')->having('emp_no','>','499990')->get(); 1 insert() DB::table('employees')->insert(['firtst_name'=>'Jack','last_name'=>'Ma']); DB::table('employees')->insert([ ['firtst_name'=>'Jack','last_name'=>'Ma'], ['firtst_name'=>'Jack2','last_name'=>'Ma'] ]); 獲取自增ID $id = DB::table('employees')->insertGetId(['firtst_name'=>'Jack','last_name'=>'Ma']); 1 update() DB::table('employees')->where('id',1)->update(['last_name'=>'Ma','gendger'=>'M']); 1 delete() DB::table('employees')->where('id',1)->delete(); 1 Eloquent 定義模型 $ php artisan make:model Employee 1 這將在專案中生成一個Employee.php,內容如下: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Employee extends Model { // } 此時Employee模型預設對應employees表(小寫的模型類名複數格式)。 模型成員變數 $table:關聯到模型的資料表 $primaryKey:主鍵名(預設為id) $keyType:主鍵型別(預設為整形資料) $incrementing:主鍵是否自增(預設為true) $fillable:可以被賦值的屬性,不能與$guarded同時使用 $guarded:不會被賦值的屬性,不能與$fillable同時使用 獲取 $emps = Employee::all();//返回表中所有資料 $emps = Employee::where([['last_name','like','A%'],['gender','=','M']])->orderby('birth_date','asc')->limit(3)->get();//條件查詢 1 2 3 就是將Employee模型就是一個查詢構建器,我們可以在模型上使用查詢構建起的所有方法。 插入 public function store(Request $request){ $emp = new Employee(); $emp->first_name = $request->input('first_name'); $emp->last_name = $request->input('last_name'); $emp->birth_date = $request->input('birth_date'); $emp->hire_date = date('Y-m-d',time()); $emp->gender = $request->input('gender'); var_dump($emp); $emp->save(); 0 更新 $emp = Employee::find($emp_no);//先查詢 $emp->first_name = $request->input('first_name'); $emp->last_name = $request->input('last_name'); $emp->birth_date = $request->input('birth_date'); $emp->hire_date = $request->input('hire_date'); $emp->gender = $request->input('gender'); $emp->save();//更新到資料庫 批量更新: Employee::where('emp_no','>','500000')->update(['hire_date'=>'2020-05-10']); 1 刪除 Employee::find(1)->delete();//按主鍵刪除 Employee::where('last_name','AAA')->delete();//批量刪除 Employee::destroy(1);//按主鍵刪除 Employee::destroy([1,2,3]);//批量刪除 軟刪除 class Employee extends Model { use SoftDeletes; /** * 應該被調整為日期的屬性 * * @var array */ protected $dates = ['deleted_at']; } 表中有deleted_at列,那麼上面的配置將會軟刪除 關聯關係 class Employee extends Model { // protected $table = 'employees_temp'; protected $primaryKey = 'emp_no'; public $timestamps = false; // 一對一,一個Employee關聯一個salary public function salary(){ return $this->hasOne('App\Salary','emp_no','emp_no'); } // 一對多,一個Employee關聯一個title public function titles(){ return $this->hasMany('App\Title','emp_no','emp_no'); } } hasOne和hasMany的第二個引數是外來鍵名,預設為方法名加_id字尾,第二個引數為主鍵名,或當前模型的關聯欄位名稱。 $emp = Employee::find(1); $salary = $emp->salary; $titles = $emp->titles; 1 2 3 逆向 class Salary extends Model { public function Employee(){ return $this->belongsTo('App\Employee','emp_no','emp_no'); } } belongsTo第二個引數是外來鍵名,預設為當前模型名加_id字尾,第三個引數為主鍵名,預設為id。 $salary = Salary::find(1); $emp = $salary->emplioyee; 多對多 class Employee extends Model { protected $primaryKey = 'emp_no'; public $timestamps = false; //一個員工對應多個部門,一個部門有多個員工 public function departments(){ return $this->belongsToMany('App\Department','dept_emp','emp_no','dept_no'); } } class Department extends Model { protected $primaryKey = 'dept_no'; }