Admin::findOne(1); 源码追踪疑问? [ 2.0 版本 ]
最近刚学yii2 对findOne()
的源码产生疑问?具体是这样的(下面的流程都是我打断点一步步出来的):
首先findOne()
是在yiisoft/yii2/db/BaseActiveRecord.php
里的方法(大概在100行那) 代码如下:
public static function findOne($condition)
{
return static::findByCondition($condition)->one();
}
然后运行findByCondition($condition)
方法 此方法不是在BaseActiveRecord.php
里的而是在yiisoft/yii2/db/ActiveRecord.php
里的 代码如下:
protected static function findByCondition($condition)
{
$query = static::find();
if (!ArrayHelper::isAssociative($condition)) {
// query by primary key
$primaryKey = static::primaryKey();
if (isset($primaryKey[0])) {
$pk = $primaryKey[0];
if (!empty($query->join) || !empty($query->joinWith)) {
$pk = static::tableName() . '.' . $pk;
}
$condition = [$pk => $condition];
} else {
throw new InvalidConfigException('"' . get_called_class() . '" must have a primary key.');
}
}
return $query->andWhere($condition);
}
此方法返回Query的对象(yiisoft/yii2/db/Query.php
)Query.php
里有one()
方法 前面说了findOne()
方法返回还有一个one()
方法 代码如下:
public function one($db = null)
{
return $this->createCommand($db)->queryOne();
}
现在运行到one方法里面了 现在的问题是$this->createCommand($db)
这个方法,这个在Query.php
有,但是没有运行进去,也就是说,他运行的不是Query.php
的createCommand
方法,经过打断点,他运行的是yiisoft/yii2/db/Connection
.php里的createCommand
方法,所有这里就糊涂了,为什么运行的不是自己的方法,而且Query和Connection好像没有继承关系吧,希望知道的人指点迷津
共 2 个回答
-
dingjj2010 回答于 2015-10-20 09:40 举报
说明一点:
findOne()
,findAll()
,和find()->one()
,find()->all()
是走不一样的代码的。后一种才是走的query。共 1 条回复luoxiao 觉得很赞 -
Query的createCommand方法不是调用的
yiisoft/yii2/db/Connection.php
方法么?这里,没有调用到Query::createCommand的方法的原因是在ActiveRecord::find方法里面,是创建的一个ActiveQuery对象。
而ActiveQuery的类里面,对Query::createCommand方法进行了重写,所以,父类中的方法没有被调用。这也是你的父类中的断点没有进去的原因。
ActiveQuery::createCommand就是调用的Connection::createCommand方法来创建一个Command对象的。
共 3 条回复
xyf90314
最后登录:2023-03-13
在线时长:95小时23分
- 粉丝21
- 金钱5257
- 威望40
- 积分6607