tp6資料庫帥炸天的新玩法 call方法呼叫示例

2021-09-29 19:49:16 字數 3805 閱讀 5940

在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

('[email protected]'

,'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客服新裝故障的明細統計,我們這邊是從客服接受資料,可是接受過來的資料具有很高的重複的性,我們必須對其進行去重處理,但是,新裝的去重欄位沒有乙個人能給乙個確切的說法,一會說這個字段,一會兒另乙個字段,依賴你做了幾天就是在這兒糾結這個事,本來本人對系...