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主題模型學習筆記5:C原始碼理解
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框架學習筆記5:OGNL表達式
closed 在一起 放置 nbsp lap src list 對象 pan OGNL取值範圍分兩部分,root、Context兩部分 可以放置任何對象作為ROOT,CONTEXT中必須是Map鍵值對 示例: 準備工作: public void fun1() th
Kali學習筆記5:TCPDUMP詳細使用方法
CA 自己 ring int 十六 一行 全部 kali info Kali自帶Wireshark,但一般的Linux系統是不帶的,需要自行下載,並且過程略復雜 而純字符界面的Linux系統無法使用Wireshark 但是,所有Linux系統都會安裝TCPDUMP:一種基於
Dubbo學習筆記5:Dubbo整體框架分析
什麽 資源 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
論文筆記5:How 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