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();

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值