黑马lavarel教程---5、模型操作(AR模式)
黑馬lavarel教程---5、模型操作(AR模式)
一、總結
一句話總結:
AR: ActiveRecord :Active Record(活動記錄),是一種領域模型模式,特點是一個模型類對應關系型數據庫中的一個表,而模型類的一個實例對應表中的一行記錄。
?
1、Eloquent ORM:用模型操作數據庫?
ORM是對象關系模型
eloquent:英 ['el?kw?nt]:adj. 意味深長的
英 ['el?kw?nt]? 美 ['?l?kw?nt]
adj. 意味深長的;雄辯的,有口才的;有說服力的;動人的
[ 比較級 more eloquent 最高級 most eloquent ]
?
2、Laravel 自帶的 Eloquent ORM 介紹?
美觀、簡單的與數據庫打交道:Eloquent ORM 提供了一個【美觀、簡單】的與數據庫打交道的 ActiveRecord 實現,每張數據表都對應一個與該表進行交互的“Model模型”,模型允許你在表中進行數據查詢,以及插入、更新、刪除等操作。
?
3、AR模式三個核心(映射)?
1、每個【數據表】:與數據表進行交互的Model【模型】映射(實例化模型)
2、記錄中的【字段】:與模型類的【屬性】映射(給屬性賦值)
3、表中的每個【記錄】:與一個完整的請求實例映射(具體的CURD操作)
?
4、定義模型注意事項?
第一:(必做)定義一個$table屬性,值是不要前綴的表名,如果不指定則使用類名的復數形式作為表名。如果模型為Member模型在不指定table屬性的情況下,其默認會去找members表。修飾詞:protected
第二:(可選)定義$primaryKey屬性,值是主鍵名稱,如果需要使AR模式的find方法,則可能需要指定主鍵(Model::find(n)),在主鍵字段不是id的時候則需要指定主鍵。修飾詞:protected
第三: (可選)定義$timestamps屬性,值是false,如果不設置為false,則默認會操作表中的created_at和updated_at字段,我們表中一般沒有這兩個字段,所以設置為false,表示不要操作這兩個字段。修飾詞:public
第四:(可選)定義$fillable屬性,表示使用模型插入數據時,允許插入到數據庫的字段信息。修飾詞:protected
class Member extends Model{//定義模型關聯的數據表(一個模型只操作一個表)protected $table='member';//定義主鍵(可選)protected $primaryKey=‘id';//定義禁止操作時間public $timestamps=false;//設置允許寫入的數據字段protected $fillable=['id','name','age','email]; }?
?
5、模型定義時候的$fillable字段和$guarded字段的關系:protected $fillable=['id','name','age','email];?
相反:$fillable允許入庫的字段,使用$guarded是設置排除入庫的字段
?
6、使用模型中create插入數據時需要注意什么:比如向數據表中添加數據:$result=$model->create($request->all());?
要設置$fillable允許入庫的字段,使用$guarded是設置排除入庫的字段
?
7、模型的使用:模型在控制器中的使用方式有2種?
①直接像使用DB門面一樣的操作方式:以調用靜態方法為主的形式,該形式下模型不需要實例化,例如:Member::get() 等價于 DB::table(‘member’) -> get();
②實例化模型然后再去使用模型類(普通):例如:$model = new Member();$model -> get();
?
8、Member::get() 和 DB::table(‘member’) -> get()的關系?
等價于:Member::get() 等價于 DB::table(‘member’) -> get();
?
9、AR模式三個核心映射 實例?
1、$member = new Member();?? ?//映射關系1:將表映射到模型
2、$member-> name = value;?? ?//映射關系2:將字段映射到屬性
3、$member -> save();????? //映射關系3:將記錄映射到實例
每個【數據表】:與數據表進行交互的Model【模型】映射(實例化模型) 記錄中的【字段】:與模型類的【屬性】映射(給屬性賦值) 表中的每個【記錄】:與一個完整的請求實例映射(具體的CURD操作)注意:在laravel里面添加數據的時候,需要先實例化模型,然后為模型設置屬性,最后調用save方法即可。 $member = new Member(); //映射關系1:將表映射到模型 $member-> name = value; //映射關系2:將字段映射到屬性,屬性名和字段名一致 $member -> age = value; … $member -> save(); //映射關系3:將記錄映射到實例?
?
?
10、模型增加數據操作兩種方法?
1、使用AR模式:$member = new Member(); $member-> name = value; $member -> save();
2、Member::create($request->all())
?
11、Member::all() 和 Member::get()的區別(都查詢多行并且指定字段) ?
all不支持連接其他的輔助查詢方法:Member::where('id','>',2)->all([' 列 1',' 列 2']); 會報錯
?
12、在laravel里面使用ORM模型方式更新數據需要怎么做?
麻煩:兩次操作數據庫:需要先調用模型的find方法獲取對應的記錄,返回一個模型對象,然后為該模型對象設置要更新的數據(對象的屬性),最后調用save方法即可。
$user = User::find($id); $user->title = $_POST['title']; $user->content= $_POST['content']; return $user->save() ? 'OK' : 'fail';?
?
13、在laravel里面使用ORM模型方式更新數據時,save并沒有指定操作的是哪條記錄,為什么save可以準確操作?
|||-begin
$user = User::find($id); $user->title = $_POST['title']; $user->content= $_POST['content']; return $user->save() ? 'OK' : 'fail';|||-end
模型調用對象一般是單例模式,所以前面User::find($id)的時候模型就是指定的這條數據,所以save的時候更新的也就是這條數據
?
14、模型使用update方式更新?
$result=Member::where('id','7')->update(['age'=>82']);
?
?
二、模型操作(AR模式)
Laravel 自帶的 Eloquent ORM 提供了一個美觀、簡單的與數據庫打交道的 ActiveRecord 實現,每張數據表都對應一個與該表進行交互的“Model模型”,模型允許你在表中進行數據查詢,以及插入、更新、刪除等操作。
?
AR模式三個核心(映射):
每個數據表???????????????????????? 與數據表進行交互的Model模型映射(實例化模型)
記錄中的字段???????????????????? 與模型類的屬性映射(給屬性賦值)
表中的每個記錄????????????????? 與一個完整的請求實例映射(具體的CURD操作)
1、定義模型
(1)定義位置
定義模型的位置,默認是在app目錄下面,但是為了管理方便,建議分目錄進行創建:
?
?
?
?
?
(2)命名規則
本身laravel對模型的命名沒有嚴格的要求,一般采用 ?表名(首字母大寫).php
比如:Member.php? User.php?? Goods.php
?
(3)創建模型
可以使用artisan命令;
[project] > php artisan make:model Home/Member
?
?
?
?
?
創建好的初始代碼:
?
?
?
?
(4)定義模型注意事項(重點);
?
第一:(必做)定義一個$table屬性,值是不要前綴的表名,如果不指定則使用類名的復數形式作為表名。如果模型為Member模型在不指定table屬性的情況下,其默認會去找members表。修飾詞:protected
第二:(可選)定義$primaryKey屬性,值是主鍵名稱,如果需要使AR模式的find方法,則可能需要指定主鍵(Model::find(n)),在主鍵字段不是id的時候則需要指定主鍵。修飾詞:protected
第三: (可選)定義$timestamps屬性,值是false,如果不設置為false,則默認會操作表中的created_at和updated_at字段,我們表中一般沒有這兩個字段,所以設置為false,表示不要操作這兩個字段。修飾詞:public
第四:(可選)定義$fillable屬性,表示使用模型插入數據時,允許插入到數據庫的字段信息。修飾詞:protected
?
?
?
?
?
?
?
注意:使用模型中create插入數據時,要設置$fillable允許入庫的字段,使用$guarded是設置排除入庫的字段。
?
2、模型控制器中調用
?
引入Member模型類;
?
?
?
?
?
模型的使用:模型在控制器中的使用方式有2種
①直接像使用DB門面一樣的操作方式:以調用靜態方法為主的形式,該形式下模型不需要實例化,例如:Member::get() 等價于 DB::table(‘member’) -> get();
②實例化模型然后再去使用模型類(普通)
???????? 例如:$model = new Member();$model -> get();
3、定義測試路由
?
?
?
?
路由可以使用路由群組的方式進行定義。
?
4、基本操作
(1)添加數據
在laravel里面完成數據的添加可以使用兩種方式:
方式一(AR模式):使用AR模式必須要實例化模型
注意:在laravel里面添加數據的時候,需要先實例化模型,然后為模型設置屬性,最后調用save方法即可。
$member = new Member(); //映射關系1:將表映射到模型
$member-> name = value; //映射關系2:將字段映射到屬性,屬性名和字段名一致
$member -> age = value;
…
$member -> save();??????????? //映射關系3:將記錄映射到實例
如果模型中不去關聯數據表,則會報以下的錯誤:
?
?
?
?
?
?
?
?
上面的這種方法可以完成數據的插入,但是不建議使用。我們可以使用laravel提供的更高級的操作。
?
?
?
方式二:
建立簡易表單,表單中有姓名、年齡、郵箱的字段,要求能夠提交
?
?
?
?
?
?
?
?
?
?
?
首先,在控制器文件引入Request這個類
use Illuminate\Http\Request;
Request類的使用:
①對象傳遞
?
?
?
?
②request語法(與input門面有點類似,方法名一致,但是input調用的是靜態方法,而當前的不是)
$request->all()
$request->input('name');
$request->only([‘name1’,’name2’…])
$request->except([‘name1’,’name2’…])
$request->has(‘name’)
$request->get(‘name’)
?
添加操作代碼語法如下;
Member::create($request->all())//返回值是一個對象
?
?
?
?
注意:如果使用create方法,則需要在模型中定義fillable屬性,允許寫入字段的定義,如果沒有時間相關字段也需要禁用時間自動更新功能:
?
?
執行的結果:
?
?
?
(2)查詢操作
獲取指定主鍵的一條數據
$info = Member::find(4); // 靜態方法調用,獲取主鍵為4的數據
?
?
?
其結果集默認是一個對象。
?
如果需要在laravel中對象的結果集轉化成數組,則需要在最終添加方法的調用:
?-> get() -> toArray();
所以剛才的案例,如需要數組結果,則可以寫成:
$data = Member::find(4) -> toArray();
?
?
?
?
?
?
獲取符合指定條件的第一條記錄
Member::where("id",'>',4)->first();
?
?
?
?
查詢多行并且指定字段
Member::all()???
Member::all([字段1,字段2])???? //與get方法的區別,all不支持連接其他的輔助查詢方法
相當于get方法
Member::get() ???
Member::get([字段1,字段2])
按條件查詢指定多個字段
Member::where('id','>',2)->get([' 列 1',' 列 2']);???????? //數組選列
Member::where('id','>',2)->select('列1','列2')->get(); //字符串選列
Member::where('id','>',2)->select( [' 列 1',' 列 2'] )->get(); //字符串選列
?
案例:測試在all方法之前,寫一些輔助方法實現連貫操作
?
?
?
?
?
?
(3)修改數據
注意:在laravel里面如果需要更新數據(ORM模型方式),需要先調用模型的find方法獲取對應的記錄,返回一個模型對象,然后為該模型對象設置要更新的數據(對象的屬性),最后調用save方法即可。
例如:
$user = User::find($id);
$user->title = $_POST['title'];
$user->content= $_POST['content'];
return $user->save() ? 'OK' : 'fail';
?
案例:實現ORM形式模型的修改操作。修改為7 的用戶的郵箱地址為admin@itcast.cn
?
?
?
?
在AR模式中,更新操作的save并沒有指定操作的是哪條記錄,為什么save可以準確操作
模型調用對象一般是單例模式,所以前面Member::find(7)的時候模型就是指定的這條數據,所以save的時候更新的也就是這條數據
?
?
問題:能不能用模型去update呢?
答:可以使用update方法進行更新,也可以使用AR模式的方式進行更新。
?
?
?
(4)刪除數據
注意:在laravel里面如果要刪除數據,如果需要使用AR模式刪除數據必須先根據主鍵id查詢對應的記錄,返回一個模型對象,然后調用模型對象的delete方法即可。
例如代碼:
$user = User::find($id);
return $user->delete() ? 'ok' : 'fail';
?
案例:使用AR模式刪除id為7的記錄
?
?
?
?
?
問題:DB里面的刪除方式能否在模型中使用?【可以】
?
?
?
轉載于:https://www.cnblogs.com/Renyi-Fan/p/11548529.html
總結
以上是生活随笔為你收集整理的黑马lavarel教程---5、模型操作(AR模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑马lavarel教程---10、lav
- 下一篇: legend3---lavarel多对多