使用Yii2 ActiveRecord在SELECT中进行子查询

使用Yii2 ActiveRecord在SELECT中进行子查询,yii2,Yii2,是否可以将此类SQL转换为Yii2中的ActiveRecord查询: SELECT *, (select count(*) from pendaftar where pendaftar.prodi_pilihan_1 = a.id_prodi_penerima)as jum1, (select count(*) from pendaftar where pendaftar.prodi_pilihan_2 = a.id_prodi_penerima)as jum2 FROM prodi_pe

是否可以将此类SQL转换为Yii2中的ActiveRecord查询:

SELECT 
*,
(select count(*) from pendaftar where pendaftar.prodi_pilihan_1 =  a.id_prodi_penerima)as jum1,
(select count(*) from pendaftar where pendaftar.prodi_pilihan_2 = a.id_prodi_penerima)as jum2 
FROM prodi_penerima as a
我有两个关系模型,分别是
Pendaftar
ProdiPenerima

这是
Pendaftar
型号:

...
* @property ProdiPenerima $prodiPilihan1
* @property ProdiPenerima $prodiPilihan2
...
/**
 * @return \yii\db\ActiveQuery
 */
public function getPekerjaanIdPekerjaan()
{
    return $this->hasOne(Pekerjaan::className(), ['id_pekerjaan' => 'pekerjaan_id_pekerjaan']);
}

/**
 * @return \yii\db\ActiveQuery
 */
public function getUserPendaftar()
{
    return $this->hasOne(User::className(), ['id' => 'id_user_pendaftar']);
}

/**
 * @return \yii\db\ActiveQuery
 */
public function getProdiPilihan1()
{
    return $this->hasOne(ProdiPenerima::className(), ['id_prodi_penerima' => 'prodi_pilihan_1']);
}
/**
 * @return \yii\db\ActiveQuery
 */
public function getProdiPilihan2()
{
    return $this->hasOne(ProdiPenerima::className(), ['id_prodi_penerima' => 'prodi_pilihan_2']);
}
这是
ProdiPenerima
型号:

...
* @property Pendaftar[] $pendaftars
* @property Pendaftar[] $pendaftars0
...
/**
 * @return \yii\db\ActiveQuery
 */
public function getPendaftars()
{
    return $this->hasMany(Pendaftar::className(), ['prodi_pilihan_1' => 'id_prodi_penerima']);
}

/**
 * @return \yii\db\ActiveQuery
 */
public function getPendaftars0()
{
    return $this->hasMany(Pendaftar::className(), ['prodi_pilihan_2' => 'id_prodi_penerima']);
}
prodi_pilihan_1
prody_pilihan_2
pendaftar
表中的外键,该键从
ProdiPenerima
表中引用

$result = ProdiPenerima::find()
    ->select([
        '*',
        'jum1' => Pendaftar::find()
            ->select(['COUNT(*)'])
            ->where('pendaftar.prodi_pilihan_1 = a.id_prodi_penerima'),
        'jum2' => Pendaftar::find()
            ->select(['COUNT(*)'])
            ->where('pendaftar.prodi_pilihan_2 = a.id_prodi_penerima')
    ])
    ->alias('a')
    ->asArray()
    ->all();
可通过以下方式访问结果:

foreach ($result as $row) { 
    echo $row['jum1']; 
}
foreach ($result as $model) { 
    echo $model->jum1; 
}
因为使用了,所以查询返回数组数组而不是模型数组


如果需要模型,应将属性添加到模型中以存储子查询的结果:

class ProdiPenerima extends ActiveRecord {

    public $jum1;
    public $jum2;

    // ...
}
然后从查询中删除
isArray()

$result = ProdiPenerima::find()
    ->select([
        '*',
        'jum1' => Pendaftar::find()
            ->select(['COUNT(*)'])
            ->where('pendaftar.prodi_pilihan_1 = a.id_prodi_penerima'),
        'jum2' => Pendaftar::find()
            ->select(['COUNT(*)'])
            ->where('pendaftar.prodi_pilihan_2 = a.id_prodi_penerima')
    ])
    ->alias('a')
    // ->asArray()
    ->all();
可通过以下方式访问结果:

foreach ($result as $row) { 
    echo $row['jum1']; 
}
foreach ($result as $model) { 
    echo $model->jum1; 
}

但是请注意,使用
asArray()
会更快,所以除非您需要访问一些模型方法(或者依赖于DB中的值的类型转换),否则我更喜欢数组。

Nice,我不知道我们可以这样做,像往常一样回答得很好。我已经将该模型渲染到视图中,然后尝试在视图中访问该模型,如图所示
我编辑了我的评论,我输入了jum而不是jum1,但仍然存在相同的错误,我将该模型渲染到视图中,然后尝试在视图中访问该模型,如图所示
我尝试
var_dump($result)
并给我带值的数组,但是当我尝试使用