yii中all()操作的注意事项

一、

CompanyList::find()
->select([
    'company_list.*',
    'flow_bank_account.account_id',
])
->leftJoin(FlowBankAccount::tableName(), 'flow_bank_account.company_name = company_id')
->andFilterWhere(['flow_bank_account.company_name' => 24])
->all();

二、

(new \yii\db\Query())
->from(CompanyList::tableName())
->select([
    'company_list.*',
    'flow_bank_account.account_id',
])
->leftJoin(FlowBankAccount::tableName(), 'flow_bank_account.company_name = company_id')
->andFilterWhere(['flow_bank_account.company_name' => 24])
->all();

上面两个例子中一般不注意的话感觉返回的值应该是一样的,但是其实不一样,第一个返回的是一个对象,而且只有一条数据;

第二个返回的是一个数组,查询多少条就显示多少条数据;

只要原因为CompanyList::find()用的是我们自己建立的model();这个会继承ActiveRecord;这个类下会用到ActiveQuery类,这个类里面有个方法:

/**
 * @inheritdoc
 */
public function populate($rows)
{
    if (empty($rows)) {
        return [];
    }

    $models = $this->createModels($rows);
    if (!empty($this->join) && $this->indexBy === null) {
        $models = $this->removeDuplicatedModels($models);
    }
    if (!empty($this->with)) {
        $this->findWith($this->with, $models);
    }

    if ($this->inverseOf !== null) {
        $this->addInverseRelations($models);
    }

    if (!$this->asArray) {
        foreach ($models as $model) {
            $model->afterFind();
        }
    }

    return $models;
}

上面那个方法在all()中会调用:
 

public function all($db = null)
{
    if ($this->emulateExecution) {
        return [];
    }
    $rows = $this->createCommand($db)->queryAll();
    return $this->populate($rows);
}

所以两个返回的结果会不同

第一个我们可以改成:

CompanyList::find()
->select([
'company_list.*',
'flow_bank_account.account_id',
])
->leftJoin(FlowBankAccount::tableName(), 'flow_bank_account.company_name = company_id')
->andFilterWhere(['flow_bank_account.company_name' => 24])
->
createCommand()->queryAll();

这样和第二个返回的结果是一样的,

你可能感兴趣的:(yii)