在tp6中,你還在用常用的鏈式方式運算元據庫嗎?下面介紹一種非主流的鏈式操作,保證讓你的**與別人與眾不同。
在tp6的核心檔案basequery.php
中給我們裝載了乙個call方法,如圖上**:
/**
* 利用__call方法實現一些特殊的model方法
* @access public
* @param string $method 方法名稱
* @param array $args 呼叫引數
* @return mixed
* @throws exception
*/public
function
__call
(string $method
,array
$args
)elseif
(strtolower
(substr
($method,0
,10))
=='getfieldby'
)elseif
(strtolower
(substr
($method,0
,7))
=='whereor'
)elseif
(strtolower
(substr
($method,0
,5))
=='where'
)elseif
($this
->
model
&&method_exists
($this
->
model
,'scope'
.$method))
else
}
在php中call其實是乙個魔術方法。解釋:為了避免當呼叫的方法不存在時產生錯誤,可以使用 __call() 方法來避免。該方法在呼叫的方法不存在時會自動呼叫,程式仍會繼續執行下去。
很明白了吧,call方法是你呼叫了tp框架或php封裝的不存在的函式時呼叫,說的明白點就是你自己用了乙個不存在的方法,但是這個方法很有用,因為在call中已經幫你定義好。
好了,那麼我們來解讀一下上面那個call方法。
上面那個方法寫的其實非常簡潔明瞭,他給出了幾種方法,例如getby,getfieldby,where等。
我們來舉例說明一下,例如我想呼叫getby+欄位名
這個方法:
list($a
)=['版權2'];
$returnres
=$db
->
limit
($page_
,$bars)-
>
getbysecretkey($a
);或者普通寫法:
$returnres
=$db
->
limit
($page_
,$bars)-
>
getbysecretkey
('版權2'
);
,"page":}
,"statuslist":[
,]}}
以上這種方法不需要鏈結select(),因為他會直接返回資料集。
下面再舉例用where+欄位名
的方式來說明:
$returnres
=$db
->
limit
($page_
,$bars)-
>
wheresecretkey
('版權2')-
>
select()
;
獲得的資料與上面那種是一模一樣的 ,但是這種請注意需要繼續鏈結select()方法。
又例如:
list($a
,$b)=
['版權2'
,'url'];
$returnres
=$db
->
limit
($page_
,$bars)-
>
getfieldbysecretkey($a
,$b);
// 根據郵箱查詢使用者的暱稱
$nickname
= db:
:table
('user')-
>
getfieldbyemail
,'nick_name'
);
在public function __call(string $method, array $args)中 met
hod是
方法名,
例如我們
上面用的
方法名w
here
secr
etke
y,
而method是方法名,例如我們上面用的方法名wheresecretkey, 而
method
是方法名
,例如我
們上面用
的方法名
wher
esec
retk
ey,而
bars則是乙個具體的引數。
在__call方法中的where方法中我們看他返回這個:
return
call_user_func_array([
$this
,'where'],
$args
);
這個是什麼意思呢,call_user_func_array()函式的實際作用是arg
s這個變
量會把參
數傳
給args這個變數會把引數傳給
args這個
變數會把
引數傳給
this的where方法。所以我們抽絲剝繭清楚明白了:__call方式中的函式其實最終返回的where查詢。
例如:
#如果狀態存在,則執行了搜尋
if( str:
:contains
($statusdata
,(string)
$status))
$params
['where'][
]=['is_del'
,'=',0
];
使用call_user_func_array方式進行資料庫的操作:
$db
= db:
:name
($tablename);
$db-
>
field
($field);
$args=[
'url'
,'='
,'備案資訊'];
$returnres
=$db
->
limit
($page_
,$bars);
$a=call_user_func_array([
$returnres
,'where'],
$args);
halt($a
->
select()
);
獲取結果集:
collection
所以我們在進行鏈式運算元據庫時,當你需要使用這種方式操作時其實也是可以的,但是你所使用的方法不會跳轉,讓你的**有一點朦朧感。 TP6資料庫作業
1.查詢所有email欄位為 thinkphp qq.com 的資料。dump db table think tp where email thinkphp qq.com select 查詢id為3的資料email列的值。dump db table think tp where id 3 selec...
資料庫6 表的操作
表是建 在資料庫中的資料結構,是 類資料的儲存 集。create table ifnot exists 表的名字 id int not null auto increment primary key comment 主 鍵 account char 255 comment 名 default adm...
資料庫糟糕的一天
這幾天一直在運算元據庫,由於局方有乙個需求,10000客服新裝故障的明細統計,我們這邊是從客服接受資料,可是接受過來的資料具有很高的重複的性,我們必須對其進行去重處理,但是,新裝的去重欄位沒有乙個人能給乙個確切的說法,一會說這個字段,一會兒另乙個字段,依賴你做了幾天就是在這兒糾結這個事,本來本人對系...