一、
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()
createCommand()->queryAll();
->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])
->
这样和第二个返回的结果是一样的,