日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 充電吧
[導(dǎo)讀]首先看findOne的函數(shù)定義,該函數(shù)定義在BaseActiveRecord當(dāng)中return?static::findOne(['id'?=>?$id,?'status'?=>?self:

首先看findOne的函數(shù)定義,該函數(shù)定義在BaseActiveRecord當(dāng)中


return?static::findOne(['id'?=>?$id,?'status'?=>?self::STATUS_ACTIVE]);


findOne定義是:


public?static?function?findOne($condition)
{
?????return?static::findByCondition($condition)->one();
}


也就是說(shuō)我們需要看一下findByCondition的函數(shù)的定義,該函數(shù)定義在BaseActiveRecord

protected?static?function?findByCondition($condition)
{
????$query?=?static::find();

????if?(!ArrayHelper::isAssociative($condition))?{
?????//?query?by?primary?key
???????$primaryKey?=?static::primaryKey();
???????if?(isset($primaryKey[0]))?{
??????????$condition?=?[$primaryKey[0]?=>?$condition];
????????}?else?{
??????????throw?new?InvalidConfigException('"'?.?get_called_class()?.?'"?must?have?a?primary?key.');
????????}
????}
????return?$query->andWhere($condition);
}


find函數(shù)的定義是在ActiveRecord類中定義的

public?static?function?find()
{?????
?????return?Yii::createObject(ActiveQuery::className(),?[get_called_class()]);
}


也就是說(shuō)$query是一個(gè)ActiveQuery的對(duì)象,其需要傳入的參數(shù)是需要進(jìn)行查詢的類的名字"User"; 中間這一部分,先不要看,因?yàn)檫€沒(méi)時(shí)間看,直接看下面的一行addWhere該函數(shù)的定義是在Query類中

public?function?andWhere($condition,?$params?=?[])
{
????if?($this->where?===?null)?{
???????$this->where?=?$condition;
????}?else?{
???????$this->where?=?['and',?$this->where,?$condition];
????}
????$this->addParams($params);
????return?$this;
}


在這里僅僅是將傳入的參數(shù)$condition,付給ActiveQuery的where成員變量。到此findByCondition已經(jīng)執(zhí)行完成,開始執(zhí)行one函數(shù)。該函數(shù)定義在ActiveQuery類當(dāng)中

public?function?one($db?=?null)
{
????$row?=?parent::one($db);
????if?($row?!==?false)?{
????????$models?=?$this->populate([$row]);
????????return?reset($models)??:?null;
????}?else?{
????????return?null;
????}
}


首先調(diào)用父類Query的one函數(shù),該函數(shù)定義如下:

public?function?one($db?=?null)
{
????return?$this->createCommand($db)->queryOne();
}


這里就需要看一下createCommand函數(shù),該函數(shù)的定義是:

public?function?createCommand($db?=?null)
{
????if?($db?===?null)?{
????????$db?=?Yii::$app->getDb();
????}
????list?($sql,?$params)?=?$db->getQueryBuilder()->build($this);
????return?$db->createCommand($sql,?$params);
}

這里可以看到需要獲得數(shù)據(jù)庫(kù)鏈接配置,然后創(chuàng)建queryBuilder對(duì)象,并利用build模式構(gòu)建完整的sql語(yǔ)句

public?function?build($query,?$params?=?[])
{
???$query?=?$query->prepare($this);

???$params?=?empty($params)???$query->params?:?array_merge($params,?$query->params);

???$clauses?=?[
??????$this->buildSelect($query->select,?$params,?$query->distinct,?$query->selectOption),
??????$this->buildFrom($query->from,?$params),
??????$this->buildJoin($query->join,?$params),
??????$this->buildWhere($query->where,?$params),
??????$this->buildGroupBy($query->groupBy),
??????$this->buildHaving($query->having,?$params),
????];
????$sql?=?implode($this->separator,?array_filter($clauses));
????$sql?=?$this->buildOrderByAndLimit($sql,?$query->orderBy,?$query->limit,?$query->offset);
????if?(!empty($query->orderBy))?{
????????foreach?($query->orderBy?as?$expression)?{
????????if?($expression?instanceof?Expression)?{
??????????$params?=?array_merge($params,?$expression->params);??
????????????}
????????}
????}
????if?(!empty($query->groupBy))?{??
??????foreach?($query->groupBy?as?$expression)?{
?????????if?($expression?instanceof?Expression)?{
????????????$params?=?array_merge($params,?$expression->params);
????????????}
????????}
????}

????$union?=?$this->buildUnion($query->union,?$params);
????if?($union?!==?'')?{
????????$sql?=?"($sql){$this->separator}$union";
????}
????return?[$sql,?$params];?
}



好吧,看看這個(gè)吧?。。?這一部分使用了build模式,進(jìn)行創(chuàng)建整個(gè)sql語(yǔ)句下面的幾個(gè)函數(shù)就先不說(shuō)了,因?yàn)檫@一部分就是分部分進(jìn)行構(gòu)建查詢語(yǔ)句,分部分構(gòu)建select ?from join ? where group having? 每個(gè)函數(shù)都構(gòu)建了一部分語(yǔ)句,最后各個(gè)部分語(yǔ)句形成了$clauses是由各部分語(yǔ)句的數(shù)組。最后返回$sql, $param的數(shù)組,得到$sql之后可以繼續(xù)執(zhí)行了,,接下來(lái)創(chuàng)建$command

return?$db->createCommand($sql,?$params);


public?function?createCommand($sql?=?null,?$params?=?[])
{
????/**?@var?Command?$command?*/
????$command?=?new?$this->commandClass([
?????'db'?=>?$this,
??????'sql'?=>?$sql,
????]);

????return?$command->bindValues($params);
}


bindValues函數(shù)如下:



public?function?bindValues($values)
{
????if?(empty($values))?{
?????return?$this;
????}

????$schema?=?$this->db->getSchema();
????foreach?($values?as?$name?=>?$value)?{
???????if?(is_array($value))?{
?????????$this->_pendingParams[$name]?=?$value;
?????????$this->params[$name]?=?$value[0];
???????}?else?{
?????????$type?=?$schema->getPdoType($value);
?????????$this->_pendingParams[$name]?=?[$value,?$type];
?????????$this->params[$name]?=?$value;
????????}
????}
????return?$this;
}

先認(rèn)為param是空的吧,這一路跟下來(lái),腦袋都快炸了,接下來(lái)要執(zhí)行的是,yiidbcommand類的queryOne函數(shù)

public?function?queryOne($fetchMode?=?null)
{
????return?$this->queryInternal('fetch',?$fetchMode);
}

queryInternal函數(shù)定義

protected?function?queryInternal($method,?$fetchMode?=?null)
{
????$rawSql?=?$this->getRawSql();
????Yii::info($rawSql,?'yiidbCommand::query');
????if?($method?!==?'')?{
???????$info?=?$this->db->getQueryCacheInfo($this->queryCacheDuration,?$this->queryCacheDependency);
???????if?(is_array($info))?{
???????????/*?@var?$cache?yiicachingCache?*/
??????????$cache?=?$info[0];
??????????$cacheKey?=?[
??????????__CLASS__,
??????????$method,
??????????$fetchMode,
??????????$this->db->dsn,
??????????$this->db->username,
??????????$rawSql,?
????????????];
??????????$result?=?$cache->get($cacheKey);
??????????if?(is_array($result)?&&?isset($result[0]))?{
????????????????Yii::trace('Query?result?served?from?cache',?'yiidbCommand::query');
????????????????return?$result[0];
????????????}
????????}
????}

????$this->prepare(true);
????$token?=?$rawSql;
???try?{
???????Yii::beginProfile($token,?'yiidbCommand::query');
???????$this->pdoStatement->execute();
???????if?($method?===?'')?{
???????????$result?=?new?DataReader($this);
????????}?else?{
???????????if?($fetchMode?===?null)?{
??????????????$fetchMode?=?$this->fetchMode;
????????????}
???????????$result?=?call_user_func_array([$this->pdoStatement,?$method],?(array)?$fetchMode);
???????????$this->pdoStatement->closeCursor();
????????}
????????Yii::endProfile($token,?'yiidbCommand::query');
????}?catch?(Exception?$e)?{
????????Yii::endProfile($token,?'yiidbCommand::query');
????????throw?$this->db->getSchema()->convertException($e,?$rawSql);
????}

????if?(isset($cache,?$cacheKey,?$info))?{
????????$cache->set($cacheKey,?[$result],?$info[1],?$info[2]);
????????Yii::trace('Saved?query?result?in?cache',?'yiidbCommand::query');
????}
????return?$result;
}

這樣看來(lái),就是講所有的查詢結(jié)果進(jìn)行返回,那么會(huì)有人問(wèn)不是findOne嗎?在哪里進(jìn)行的取one操作呢?是在ActiveQuery的one操作中,父類得到所有的查詢結(jié)果,子類將查詢結(jié)果進(jìn)行reset操作,將第一行記錄返回
查詢總覽: 所有的都是這樣查詢的static::findOne(條件),findOne函數(shù)定義是在BaseActiveRecord類中定義的,因?yàn)楫?dāng)前使用的User類的父類是ActiveRecord而ActiveRecord的父類是BaseActiveRecord 在此調(diào)用的是findByCondition在該函數(shù)中獲得了ActiveQuery類的對(duì)象,同時(shí)傳入需要修改的類的名稱(需要調(diào)用該類的靜態(tài)函數(shù)tableName,獲得表名稱),并且在findByCondition中將條件數(shù)組轉(zhuǎn)成 String,方便繼續(xù)使用,繼續(xù)調(diào)用ActiveQuery的addWhere記錄下ActiveQuery的where條件,之后調(diào)用Query的one()函數(shù),在Query的one函數(shù)中創(chuàng)建了yiidbConnection類的對(duì)象,繼續(xù)調(diào)用該db對(duì)象的getQueryBuilder函數(shù),創(chuàng)建了一個(gè)QueryBuilder對(duì)象,然后在QUeryBuilder對(duì)象中進(jìn)行完整的sql構(gòu)造,將sql查詢語(yǔ)句中可能出現(xiàn)的各個(gè)子查詢都進(jìn)行分別處理,各部分處理結(jié)果得到一個(gè)字符串,將這部分字符串組成數(shù)組,在展開implode,合成一個(gè)sql語(yǔ)句,將生成的sql語(yǔ)句傳遞給由yiidbConnection創(chuàng)建的yiidbcommand對(duì)象,并進(jìn)行執(zhí)行queryOne函數(shù)該函數(shù)調(diào)用queryInternal并返回結(jié)果集,最后由ActiveQuery的one函數(shù)進(jìn)行reset操作,返回第一個(gè)結(jié)果記錄






本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉