1. 程式人生 > >tp5.0筆記5:關聯模型

tp5.0筆記5:關聯模型

前面筆記3說,資料庫操作分為三個層次,前兩個層次已經在筆記3進行彙總了,現將第三個層次進行了彙總如下

場景1:現有一個使用者表,和一個書籍表,使用者與書籍的關係是一對多,那麼我們就可以利用tp5.0的提供的關聯模型,內容如下

<?php
namespace app\index\model;
use think\Model;

class User extends Model{
    public function books(){ //方法名避免與user模型的欄位屬性重名
       return $this->hasMany('Book') ;
    }
}

在實際獲取關聯資料的時候,就是採用下面的方式

<?php
$user = User::get(5);
echo $user->niackname;
dump($user->books);
$user->books()->where('name','thinkphp')->find();

1、一對一關係

我們以使用者與檔案的一對一關聯為例

<?php
namespace app\index\model;
use think\Model;

class User extends Model{
   //自定義自動寫入的屬性
   protected $insert = ['status'=>1];
   //自動寫入時間戳
   protected $autoWriteTimestamp = true;
   //定義關聯方法
   public function profile(){

     return $this->hasOne('Profile','user_id','id');
   }
}
hasOne('關聯模型名','關聯外來鍵','主鍵','別名定義','join型別');

預設關聯模型的外來鍵是:當前模型名_id ,如果外來鍵名符合規範,直接傳入模型名即可

通常關聯模型與當前模型在同一名稱空間,若不在同一名稱空間下,則傳入名稱空間一併傳入

 return  $this->hasOne('\app\admin\Profile');

要進行模型的關聯操作,我們必須同時定義好關聯模型

<?php
namespace app\index\model;
use think\Model;

class Profile extends Model{
    protected $type = [
       'birthday'=>'timestamp',
    ];
    public function user(){             //如果所有的關聯操作都是基於User模型,user方法無需定義
        return $this->belongsTo('User');//當前的模型所對應的表、存在與user的關聯外來鍵(user_id),屬從屬關係,那麼就用belongsTo(),否則使用hasOne()
    }
}

belongsTo方法與hasOne一樣,傳入的引數一樣

belongsTo('關聯模型名','關聯外來鍵','關聯模型主鍵','別名定義','join型別');

1.2 關聯寫入

<?php
namespace app\index\controller;
use app\index\model\Profile;
use app\index\model\User as UserModel;

class User extends Controller{
    
   public function add(){
        $user = new UserModel;    
        $user->name = 'thinkphp';
        $user->password = '123456';
        $user->nickname = '寶寶不舒服';
        if($user->save()){
            $profile['truename'] = '寶寶不舒服';
            $profile['birthday'] = '1989-03-05';
            $profile['address']  = '深圳';
            $user->profile()->save($profile);
            return $this->success('新增成功');
        }else{
            return $user->getError();
        }
   }
}

關聯模型的寫入呼叫了關聯方法profile(),返回一個relation物件,執行save方法會自動傳入當前模型User的主鍵作為關聯鍵值,所以不需要手動傳入profile的user_id

1.3、關聯查詢

<?
public function read($id){
    $user = UserModel::get($id);
    if($user){
      echo  $user->name;
      echo  $user->nickname;
      echo  $user->profile->truename;
    }
}

我們也可以為提高查詢效率,在get方法傳入第二個引數,關聯模型名

$user = UserModel::get($id,'profile');

1.4、關聯更新

public function update($id){
   $user = UserModel::get($id);
   $user->name = 'framework';
   if($user->save()){
      $user->profile->email = '[email protected]';
      $user->profile->save();
      
    }else{
        return $user->getError();
    }

}

1.5、關聯刪除

public  function delete($id){
    $user = UserModel::get($id);
    if($user->delete()){
        $user->profile->delete();
     }else{
       return $user->getError();
     }
}

2、一對多關聯

我們以作者與多本書之間就是一對多的關聯關係、在user模型中繼續新增內容如下

<?php
namespace app\index\model;
use think\Model;

class User extends Model{
  public  function books(){
   return $this->hasMany('Book');
  }

}
hasMany('關聯模型','關聯外來鍵','關聯模型主鍵','別名','join型別');

而在關聯模型中,與一對一的關聯模型一樣

<?php
namespace app\index\model;
use think\Model;

class Book extends Model{
  public function user(){
     return $this->belongsTo('User');
  }
}

2.1、關聯新增

public function addBook(){
    $user = UserModel::get(1);
    $book = new Book;
    $book->title = 'thinkphp';
    $book->publih_time = '2016-05-06';
    $user->books()->save($book);
}

一對多關係也可以批量增加資料

public  function batchAddBook(){
   $user = UserModel::get(1);
   $book = [
     ['title'=>'thinkphp5.0','publish'=>'2016-05-06'],
     ['title'=>'thinkphp3.2','publish'=>'2014-05-06']
   ];
    $user->books()->saveAll($books);
}

2.2、關聯查詢

public function read(){
  $user = UserModel::get(1,'books');
  $books = $user->books;
  dump($books);
}

如果要對關聯模型的資料,進行過濾查詢

public function read(){
  $user = UserModel::get(1);
  $books = $user->books()->where('status',1)->select();
  $book  = $user->books()->getByTitle('寶寶想哭');
}

也可以根據關聯模型,查詢當前user模型的資料

public function read(){
  //查詢寫過書的作者列表
  $user = UserModel::has('books')->select();
  //查詢寫過三本書以上的作者
  $user = UserModel::has('books','>=',3)->select();
  //查詢寫過寶寶不哭的作者
  $user = UserModel::hasWhere('books',['title'=>'寶寶不哭'])->select();
}

2.3、關聯更新

public  function update($id){
    $user = UserModel::get($id);
    $book = $user->books()->getByTitle('title','寶寶不哭');
    $book ->title = '寶寶就要哭';   $book->save();
}

也可以使用查詢構造器的update方法進行更新

public  function update($id){
  $user = UserModel::get($id);
  $book = $user->books()->where('title','寶寶不哭')->update(['title'=>'寶寶就要哭']);
}

2.4、關聯刪除

public function delete($id){
   $user = UserModel::get($id);
   $book = $user->books()->getByTitle('Thinkphp');
   $book->delete();
}

刪除所有關聯資料

public function delRelation(){
   $user = UserModel::get(1);
   $user->delete();
   $user->books()->delete();
}

3、多對多關聯

在做許可權管理功能時,一個使用者往往有多個角色,同時一個角色也包含多個使用者,那麼我們在建表時, 會建立中間表來描述他們的關係,表中包含兩邊表的主鍵。

在user 的模型中,關聯方法定義

public function roles(){

   return $this->belongsToMany('Role','Think_access');
}

其中的belongsToMany的引數如下

belongsToMany('關聯模型名','中間表名稱','關聯模型外來鍵','別名定義');

關聯模型Role定義如下

<?php
namespace app\index\model;
use think\model;

class Role extends Model{
   public function user(){
     return $this->belongsToMany('User','think_access');
   }

}

3.2、關聯新增

給一個使用者增加編輯角色,並且這個角色尚未建立,方式如下

public function add(){
   $user = UserModel::getByNickname('張三');
   $user->roles()->save(['name'=>'editor','title'=>'編輯']);
}

也可以給使用者進行批量化新增

public function add(){
   $user = UserModel::getByNickname('張三');
   $user->roles->saveAll([
     ['name'=>'leader','title'=>'領導'],
     ['name'=>'admin','title'=>'管理員'],
  ]);

}

如果新增的角色已經存在,只是建立他們的關聯關係

public function add(){
   $user = UserModel::getByNickname('張三');
   $role = Role::getByName('editor');
   $user->roles()->attach($role);//也可以直接傳入role的id
}

3.3、關聯刪除

如果刪除使用者的管理角色,

public function delete(){
   $usr = UserModel::get(2) ;
   $role = Role::getByName('admin');
   $user->roles()->detach($role);
}

如果有必要將 角色和關聯關係也一起刪除,只需在detach方法傳入第二個引數true

public function delete(){
   $usr = UserModel::get(2) ;
   $role = Role::getByName('admin');
   $user->roles()->detach($role,true);
}

3.4、關聯查詢

public function read(){
     $user = UserModel::getByNickName('張三');
     $user = UserModel::get(2,'roles');  // 預載入查詢

}



相關推薦

tp5.0筆記5關聯模型

前面筆記3說,資料庫操作分為三個層次,前兩個層次已經在筆記3進行彙總了,現將第三個層次進行了彙總如下場景1:現有一個使用者表,和一個書籍表,使用者與書籍的關係是一對多,那麼我們就可以利用tp5.0的提供的關聯模型,內容如下<?php namespace app\inde

LDA主題模型學習筆記5C原始碼理解

1,說明 本文對LDA原始論文的作者所提供的C程式碼中LDA的主要邏輯部分做註釋,原始碼可在這裡下載到:https://github.com/Blei-Lab/lda-c 這份程式碼實現論文《Latent Dirichlet Allocation》中介紹的LDA模型,用變分

《大型網站技術架構核心原理與案例分析》-- 讀書筆記 (5) 網購秒殺系統

案例 並發 刷新 隨機 url 對策 -- 技術 動態生成 1. 秒殺活動的技術挑戰及應對策略 1.1 對現有網站業務造成沖擊 秒殺活動具有時間短,並發訪問量大的特點,必然會對現有業務造成沖擊。對策:秒殺系統獨立部署 1.2 高並發下的應用、

C++筆記(5)繼承和多態代碼實現

c++筆記 esp 變量 main style cnblogs radius 區分 fine Shape.h 1 #ifndef SHAPE_H 2 #define SHAPE_H 3 #include<string> 4 using std::str

python筆記5函數式編程

res () print 作用 map() 完成 false 逗號 單行函數 5 函數式編程(即高階函數,將函數作為參數傳入) map(): map()函數接收兩個參數,一個是傳入函數,一個是Iterable,map將傳入函數依次作用到序列的每個元素,並把結果作為新的It

hibernate框架學習筆記5緩存

很好 close nts oid img 關閉資源 次方 兩個 res 緩存不止存在與程序中,電腦硬件乃至於生活中都存在緩存 目的:提高效率 比如IO流讀寫字節,如果沒有緩存,讀一字節寫一字節,效率低下 hibernate中的一級緩存:提高操作數據庫的效率 示例:

struts2框架學習筆記5OGNL表達式

closed 在一起 放置 nbsp lap src list 對象 pan OGNL取值範圍分兩部分,root、Context兩部分 可以放置任何對象作為ROOT,CONTEXT中必須是Map鍵值對 示例: 準備工作: public void fun1() th

Kali學習筆記5TCPDUMP詳細使用方法

CA 自己 ring int 十六 一行 全部 kali info Kali自帶Wireshark,但一般的Linux系統是不帶的,需要自行下載,並且過程略復雜 而純字符界面的Linux系統無法使用Wireshark 但是,所有Linux系統都會安裝TCPDUMP:一種基於

Dubbo學習筆記5Dubbo整體框架分析

什麽 資源 AD 文本文件 font ren factor exporter 服務提供者 Dubbo的分層架構 本文將簡單介紹Dubbo的分層架構設計,如下圖是Dubbo官方的整體架構圖: Dubbo官方提供的該架構圖很復雜,一開始我們沒必要深入細節,下面我們簡單介紹

DeepLearning.ai筆記:(5-3) -- 序列模型和注意力機制

title: ‘DeepLearning.ai筆記:(5-3) – 序列模型和注意力機制’ id: dl-ai-5-3 tags: dl.ai categories: AI Deep Learning date: 2018-10-18 18:39:10

論文筆記5How to Discount Deep Reinforcement Learning:Towards New Dynamic Strategies

參考資料:How to Discount Deep Reinforcement Learning: ... 為幫助跟我一樣的小白,如果有大神看到錯誤,還請您指出,謝謝~ 知乎同名:uuummmmiiii 創新點:相比於原始DQN不固定折扣因子(discount factor,γ),學習率(

Less學習筆記5匹配模式

匹配模式:類似於JS中的if語句,但不完全是,滿足一定條件後才能匹配 比如:用CSS去畫一個三角 <div class='triangle'></div> .triangle{     width: 0;    &

Esper學習筆記程序模型

1.UpdateListener UpdaterListener是Esper提供的一個介面,用於監聽某個EPL在引擎中的執行情況,即事件進入併產生結果後會通知UpdateListener。 介面如下: package com.espertech.esper.client;

讀書筆記5引用型別

本章節內容多且碎,也都是非常基礎的內容,但同時因為其基礎,往往容易被忽略,所以本章整理會有較多的細節,內容比較繁瑣。 #1 類和物件 ECMAScript 中,引用型別是一種資料結構,用於將資料和功能組織在一起。 (1)類的概念 類的實質是一種資料型別,類似

Deep Learning 學習筆記5神經網路彙總

本篇文章整理自FJODOR VAN VEEN的論文:The Neural Network Zoo。本文介紹了神經網路大家族,但不是所有的神經網路都能涵蓋,畢竟新的網路結構在不斷被髮展出來。以下是神經網路的圖譜。 介紹神經網路之前,先介紹神經元的分類,這部分內容來自博友的

flutter筆記5官方資料搬運-安卓客戶端打包

上一篇,使用material原生控制元件完成了人生的一個用flutter開發的APP,這兩天為了理解flutter,翻了很多資料,資訊量太大,燒了不少腦子,今天這篇就簡單點,實戰走一下安卓客戶端的打包流程,看看會遇到什麼問題。想檢視官方資料的請移步Preparing an A

《網際網路程式設計(Java)》——課程筆記5網路檔案傳送程式設計

學會基本的檔案傳輸FTP程式設計技術。 前兩講我們學會了使用TCP套接字(Socket),能實現字串的傳送和接收功能,簡單地做到了客戶機和伺服器的對話。 今天,我們進一步學習TCP套接字,利用它的位元組傳輸技術,實現網路檔案傳輸。 檔案傳輸協議規定(RFC 959 FT

視覺化學習筆記5形狀,大小和其他工具

表示資料的其他方式 現在你應該能夠在視覺化圖表中熟練地使用顏色來表示值了。有時候,除了顏色之外,你需要顯示更多的資料。你可以使用不同的表示方式,例如在散點圖中使用不同形狀和大小的標記。下面我將介紹如何使用這些工具在一個圖表中展示更多的資料。

python學習筆記5列表-元組-集合-字典

list列表 一組有順序的資料的組合,可進行增刪改查 賦值操作 ls = list() ,ls = [] 下標從0開始,最後一個數可使用-1訪問,依次類推 可使用其切片操作[:],反序排列[::-1] 進行切片和copy()後的新list的ID原id不一致

強化學習系列5模型的策略迭代方法

1. 策略迭代演算法 這裡策略迭代使用的是表格法,基本步驟是: 用字典儲存每個s的v值 根據v值來選骰子 策略迭代的步驟為: 初始化 V