TP5 模型CURD


ThinkPHP5的模型是一種對象-關系映射(Object / Relation Mapping ,簡稱 ORM)的封裝,並且提供了簡潔的ActiveRecord實現。一般來說,每個數據表會和一個“模型”對應。

 ThinkPHP5 模型類和Db類的區別主要在於對象的封裝,Db類的查詢默認返回的是數組(或者集合),而模型類返回的是當前的模型對象實例(或者集合)模型是比Db類更高級的數據支持模型關聯、模型事件

 

ThinkPHP5 模型屬性$table 不再是包含表前綴的表名;$name則是包含表前綴的表名

一般來說,模型的屬性名 就是對應的數據表的字段名

 

Model模型類

· protected  $name; //包含表前綴的數據表

· protected  $table; //不包含表前綴的數據表,使用的時候要加上表前綴

: protected  $table = ‘tp_admin_user’; 

模型類 public類型屬性 就是對應的表的字段名。如果給模型類的屬性不對應字段名的話,會報錯

 

$user = new User; // User為模型類

$user->user_name = ‘admin’; // useruser_name 字段

$user->password = md5(‘123456’); // userpassword 字段

 

$user[‘user_name’]  等同  $user->username;

 疑惑:如果此時使用save()方法,會是修改 還是 什么情況?

$user->save(); //此時為新增!!!

因為當 $user對象沒有給定 主鍵的時候,此時為新增; 如果給定主鍵,此時為修改!

 

 

另外一種新增數據為 模型::create();

 

那么問題來了,什么時候使用save() create()呢?

 

 

·新增數據

由此可見,當實例化模型的時候,使用 save() saveAll() 方法進行添加。

如果使用 模型類, 就使用 XXModel::create(); 進行添加

 

$user = new User; // User為模型類

此時$user->save($data)  或  User::create($data);   兩者返回的還是模型的實例化對象,不同的是User模型類create()后 返回的是 新new的對象而已。

 

--------------------------------------------

 

 

批量新增數據

實際操作的時候,是執行了多條的insert into 數據。並非真的一次性插入。

 

 


 

 

 

查詢

 

 

 

· getBy字段名();  查詢對應的單條查詢,字段名第一個字母要大寫!

 

   : 查詢 level_id字段的值為4的這條信息

$user->getByLevelId(4);

 

   如:查詢 name 字段的值為 admin的這條信息

$user->getByName(‘admin’);

 

$user = new User; //User 為模型類

$user->getBy字段名(‘值’); //返回當前 字段名= 值 的這條信息.

$user->getData(); //可以將單條信息 轉換為 數組

 

注意:getBy字段名(),  如果字段名有”_” 同樣將首字母和_后的首字母轉為大寫!!!

 

 

 

·get() 可查詢主鍵 或 非主鍵

 

如:查詢主鍵為1的單條信息

$user->get(1);

如:表沒有主鍵,可使用數組來傳遞查詢

$data = [‘name’=>’site_name’];

$user->get($data); //查詢沒有主鍵的 單條數據

使用 where為追加條件

$map = ['level_id'=>2];

$result3 = $model->where($map)->find();

 

 


 

 

更改

 

 

 

 

$user = new User; //User為模型類

$user->save($data,  $where條件);

 

Model::update($dasta, $where條件);

 

 

 

上面講過,如果沒有給定主鍵 此時 $user->save(); 為新增,如果當表中沒有主鍵怎么辦?

$user->isUpdate(true)->save();  //強制為更新操作

 

 

以下內容為知識擴展,不要拿到實戰中,否則潛在問題會困擾很久!!

還有一種情況是  $user = User::get(1); $data = [.. ...]; 如果沒有給定主鍵,是新增嗎?

答案是修改!!!  因為$user User::get(1)返回的對象,1就是主鍵,所以此時為修改,並非進行新增操作!!!

 

問題又來了,如果我現在就想把$user->save($data);  為新增,該怎么操作?

答: $user->主鍵 = NULL;  $user->isUpdate(false)->save($data); 此時為新增操作。

 

問題又來了,新增后的數據信息,除了主鍵,$data中不存在的信息,則是復制User::get(1)默認的數據!!!!! 這招太坑

最好使用 Model::create() 或 干脆直接new Model save(),一般不建議使用 User::get(1) 這種直接返回實例化的對象 再進行CURD;

 


  

刪除操作

 

Model::destory(主鍵id);

如: User::destroy(33); // 刪除主鍵33的單條信息

 

對象->where(條件)->delete();

:  $user->where(‘id =5 ’)->delete(); //刪除主鍵5的單條信息

 

 

 

學習模型總結:

·新增數據

·批量新增

·查詢數據

·數據列表

·更新數據

·刪除數據

 

小技巧總結:

·獲取模型類對應表的字段名, new 模型類,再使用 屬性進行相關操作

  :   $user = new User; //User為模型類

$user->user_name 與  $user[‘user_name’] 等同!!

因為基類Modeimplements \ArrayAccess , 可以將屬性當成數組的形式來訪問。

 

·數據表存在“_”的問題

  如果數據表存在下划線,將下划線去掉,模型的名字首字母大寫。

 如: tp_admin_user,  對應的模型名 AdminUser .

 

·如果數據表 與 當前模型名稱不一致,怎么辦?

 在模型類內  protected $name =”要關聯的表名”;

  : tp_admin_user,    User模型   protected $name = ‘user’;

 

·模型類 或 模型對象 get() find() 查詢后的結果 怎么轉成數組?

通過 getData()方法,

:  $result = $user->find(1);  $result->getData();

 

·模型類 或 模型對象 all() select() 查詢后的結果 怎么轉數組?

  此時查詢的多條信息為 結果集!! 不能使用getData()一次性轉數組,

可以使用foreach() 來逐條轉為數組,但太麻煩!!!。

 

通過 collection(結果集)->toArray();

如: $result = $user->select();  $data = collection($result)->toArray();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM