您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)laravel框架中數(shù)據(jù)庫(kù)操作、查詢構(gòu)建器、Eloquent ORM操作的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
具體如下:
1、連接數(shù)據(jù)庫(kù)
laravel連接數(shù)據(jù)庫(kù)的配置文件位于config/database.php中,在其中connection字段中包含laravel所支持的數(shù)據(jù)庫(kù)的配置信息,可以看到其中有主機(jī)、端口、數(shù)據(jù)庫(kù)、用戶名、密碼等信息:
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '3306'), '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文件中的默認(rèn)值,laravel目錄最外層有.env文件,在其中配置對(duì)應(yīng)的默認(rèn)值
DB_HOST=數(shù)據(jù)庫(kù)服務(wù)器地址
DB_PORT=數(shù)據(jù)庫(kù)端口
DB_DATABASE=數(shù)據(jù)庫(kù)名
DB_USERNAME=用戶名
DB_PASSWORD=密碼
2、原生SQL操作數(shù)據(jù)庫(kù)
在controller中對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查的操作
public static function testDB(){ //增加一條數(shù)據(jù) DB::insert("insert into student(name,age) values(?,?)",['sandy',19]); //刪除一條數(shù)據(jù) DB::delete('delete from student where name=?',['sandy']); //修改一條數(shù)據(jù) DB::update('update student set sex=? where name=?',['男','tory']); //查詢數(shù)據(jù) $res=DB::select('select * from student'); //進(jìn)行數(shù)據(jù)庫(kù)通用操作 DB::statement('drop table users'); //打印結(jié)果 dd($res); }
其中通過(guò)?占位符的方式進(jìn)行了參數(shù)綁定,以此來(lái)防止數(shù)據(jù)庫(kù)注入攻擊,也可以通過(guò)命名綁定的方式:
$res = DB::select('select * from users where id = :id', ['id' => 1]);
3、通過(guò)查詢構(gòu)建器操作數(shù)據(jù)庫(kù)
Laravel將常用的數(shù)據(jù)庫(kù)操作封裝為接口函數(shù)提供給用戶調(diào)用,從而使數(shù)據(jù)庫(kù)操作更為便捷,這些接口就是查詢構(gòu)建器(query builder)。而且通過(guò)PDO綁定的方式避免SQL注入攻擊,在使用查詢構(gòu)建器時(shí)不必考慮過(guò)濾用戶輸入。
3.1、得到結(jié)果集
lavarel查詢的返回結(jié)果集合是StdClass,可以通過(guò)$res->name類似訪問(wèn)對(duì)象屬性的方式訪問(wèn)返回值。如果要查詢整個(gè)表使用get(),查詢表中一條數(shù)據(jù)使用first(),查詢一條數(shù)據(jù)的某個(gè)字段用value(),查詢表中所有數(shù)據(jù)的某個(gè)字段用pluck()
//get()返回表中所有數(shù)據(jù) $res=DB::table('student')->get(); //first()返回結(jié)果集中的第一條數(shù)據(jù) $res=DB::table('student')->where('id','1001')->first(); //value()返回一條數(shù)據(jù)中的指定字段 $res=DB::table('student')->where('id','1003')->value('name'); //pluck()返回結(jié)果集中name字段的所有值 $res=DB::table('student')->pluck('name');
當(dāng)結(jié)果集中的數(shù)據(jù)過(guò)多時(shí),可以通過(guò)分塊的方式返回結(jié)果集,chunk函數(shù)第一個(gè)參數(shù)為分塊的大?。ㄒ悦繅K2個(gè)數(shù)據(jù)的方式返回結(jié)果集),第二個(gè)參數(shù)為回調(diào)函數(shù),當(dāng)其返回false時(shí)就停止結(jié)果集的返回:
DB::table('student')->chunk(2,function ($res){ foreach ($res as $user){ var_dump($user); if ($user->id >=1003) return false; } });
3.2、增刪改查
//增加一條數(shù)據(jù) DB::table('student')->insert(['name'=>'李four','sex'=>'男','age'=>22]); //增加多條數(shù)據(jù) DB::table('student')->insert([ ['name'=>'wang五','sex'=>'女','age'=>21], ['name'=>'zhao六','sex'=>'女','age'=>20], ]); //刪除數(shù)據(jù) DB::table('student')->where('id','>=',1006)->delete(); //刪除整個(gè)表 DB::table('student')->truncate(); //修改數(shù)據(jù) DB::table('student')->where('id',1005)->update(['sex'=>'女','age'=>21]); //自增increment、自減decrement,默認(rèn)增1 DB::table('student')->where('id',1005)->increment('age',2); //自增同時(shí)可以進(jìn)行修改 DB::table('student')->where('id',1005)->increment('age',1,['sex'=>'女']); //查詢指定字段 $res=DB::table('student')->select('name','age')->get();
3.3、查詢條件
通過(guò)查詢構(gòu)建器的where方法可以添加數(shù)據(jù)庫(kù)查詢條件,where()
接收三個(gè)參數(shù):字段名、操作符、值,操作符如果是'='可以省略,例如查詢id>=1003的數(shù)據(jù):
$res=DB::table('student')->where('id','>=',1003)->get();
也可以通過(guò)條件數(shù)組傳入多個(gè)限制條件,比如查詢id>=1003并且id<1005:
$res=DB::table('student')->where([ ['id','>=',1003], ['id','<',1005] ])->get();
通過(guò)orwhere()
來(lái)連接兩個(gè)并列條件,例如查詢id>=1003或者id<1002的數(shù)據(jù):
$res=DB::table('student')->where('id','>=',1003)->orwhere('id','<',1002)->get();
whereBetween()
查詢位于某個(gè)區(qū)間的數(shù)據(jù):
$res=DB::table('student')->whereBetween('id',[1003,1006])->get();
當(dāng)when()
來(lái)判斷某個(gè)查詢是否執(zhí)行,例如當(dāng)$order為true時(shí),才會(huì)執(zhí)行排序:
$order=false; $res=DB::table('student')->when($order,function ($query){ return $query->orderBy('age','desc'); //$order為true時(shí)才執(zhí)行此語(yǔ)句 })->get();
3.4、排序、分組、限定
//orderBy對(duì)age字段升序 $res=DB::table('student')->orderBy('age','asc')->get(); //按照create_at字段進(jìn)行時(shí)間排序 $res=DB::table('student')->latest('create_at')->get(); //分組 $res=DB::table('student')->groupBy('sex')->get(); //跳過(guò)一條數(shù)據(jù)后返回2條數(shù)據(jù) $res=DB::table('student')->skip(1)->limit(2)->get();
3.5、聚合函數(shù)
laravel查詢構(gòu)建器還提供了聚合函數(shù)用于操作查詢的結(jié)果集,包括count(計(jì)數(shù))、sum(求和)、avg(平均值)、max(最大值)、min(最小值),例如求年齡平均值:
$res=DB::table('student')->avg('age');
4、Eloquent ORM
ORM是對(duì)象關(guān)系映射(Object Relational Mapping)的簡(jiǎn)稱,是一種實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換的技術(shù),即將數(shù)據(jù)庫(kù)中的數(shù)據(jù)按照對(duì)象的形式進(jìn)行組織,可以便于面向?qū)ο蟮某绦蜻M(jìn)行數(shù)據(jù)庫(kù)操作,之前在學(xué)習(xí)mongoDB時(shí)使用過(guò)mongoose ORM組織mongoDB ,當(dāng)時(shí)還沒(méi)有意識(shí)到這是orm。
Laravel內(nèi)置的Eloquent ORM提供了一種便捷的方式幫助你組織數(shù)據(jù)庫(kù)數(shù)據(jù),每張數(shù)據(jù)表都對(duì)應(yīng)一個(gè)與該表進(jìn)行交互的模型(Model),通過(guò)Model類,你可以對(duì)數(shù)據(jù)表進(jìn)行查詢、插入、更新、刪除等操作。Eloquent ORM本質(zhì)上是查詢構(gòu)建器,因此上面查詢構(gòu)建器所使用的方法Eloquent都可以使用。
4.1、創(chuàng)建Model
在app文件夾下新建model文件,每個(gè)數(shù)據(jù)庫(kù)都需要對(duì)應(yīng)一個(gè)model,例如創(chuàng)建一個(gè)Student模板類:
namespace App; use Illuminate\Database\Eloquent\Model; class Student extends Model { //指定對(duì)應(yīng)的表 protected $table='student'; //指定主鍵 protected $primaryKey='id'; //允許批量賦值的字段 protected $fillable=['name','age']; //不允許批量賦值的字段 protected $guarded=['created_at']; }
模板類會(huì)默認(rèn)對(duì)應(yīng)小寫(xiě)首字母末尾加s的數(shù)據(jù)庫(kù),例如Student模板會(huì)在當(dāng)前數(shù)據(jù)庫(kù)中查找students表。如果需要自定義表名,則需要重寫(xiě)$table變量來(lái)指定表名。
Eloquent默認(rèn)的主鍵為'id',且該字段為自增int型,如果需要自定義主鍵,可以通過(guò)$primaryKey來(lái)指定。
Eloquent默認(rèn)會(huì)管理數(shù)據(jù)表的創(chuàng)建時(shí)間、更新時(shí)間,對(duì)應(yīng)數(shù)據(jù)表中的created_at、updated_at字段,你需要在創(chuàng)建表時(shí)包含這兩個(gè)字段。如果不需要管理,可以令public $timestamps = false;。否則會(huì)報(bào)錯(cuò)
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list'
也可以自定義兩個(gè)時(shí)間為你數(shù)據(jù)庫(kù)中的字段:
const CREATED_AT = 'my_create'; const UPDATED_AT = 'my_update';
4.2、Eloquent操作數(shù)據(jù)庫(kù)
新增數(shù)據(jù)有兩種方法,一是通過(guò)新建ORM實(shí)例,而是通過(guò)create方法。在使用create批量添加時(shí),需要在模板中通過(guò)$fillable指定可以賦值的字段,也可以$guard指定不允許賦值的字段。
//新建實(shí)例并賦值、保存 $stu=new Student(); $stu->name='orm2'; $stu->save(); //create方法批量添加數(shù)據(jù) Student::create(['name'=>'orm3','age'=>13]);
刪除數(shù)據(jù)也有兩種方法,一是通過(guò)find方法刪除指定主鍵,二是通過(guò)查詢構(gòu)建器:
//destroy刪除指定主鍵值 Student::destroy(1006,1007); //通過(guò)查詢構(gòu)建器刪除 Student::where('id',1008)->delete();
修改數(shù)據(jù):①通過(guò)ORM實(shí)例來(lái)修改并保存②通過(guò)查詢構(gòu)建器
//通過(guò)返回Student對(duì)象進(jìn)行修改 $stu=Student::find(1005); $stu->age=21; $stu->save(); //通過(guò)查詢構(gòu)建器修改 Student::where('id',1005)->update(['age'=>22]);
查找數(shù)據(jù):
//查詢表中所有記錄 $table=Student::all(); //根據(jù)id查詢一條數(shù)據(jù) $row=Student::find(1002); dd($table);
當(dāng)然也可以通過(guò)構(gòu)建器的get()、first()來(lái)獲取數(shù)據(jù)
通過(guò)上面的增刪改查可以看出Eloquent可以使用查詢構(gòu)建器的所有方法,除了增刪改查外,還有where、聚合函數(shù)等。
關(guān)于“l(fā)aravel框架中數(shù)據(jù)庫(kù)操作、查詢構(gòu)建器、Eloquent ORM操作的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。