是否可以在Yii2中将此类SQL转换为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
Run Code Online (Sandbox Code Playgroud)
我有两个关系模型是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']);
}
Run Code Online (Sandbox Code Playgroud)
这是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']);
}
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
结果可通过以下方式访问:
foreach ($result as $row) {
echo $row['jum1'];
}
Run Code Online (Sandbox Code Playgroud)
因为asArray()
使用了,所以查询返回数组的数组而不是模型数组.
如果需要模型,则应在模型中添加属性以存储子查询的结果:
class ProdiPenerima extends ActiveRecord {
public $jum1;
public $jum2;
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后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();
Run Code Online (Sandbox Code Playgroud)
结果可通过以下方式访问:
foreach ($result as $model) {
echo $model->jum1;
}
Run Code Online (Sandbox Code Playgroud)
但请注意,使用asArray()
会更快,所以除非你需要访问一些模型方法(或依赖于来自DB的值的类型转换),我宁愿使用数组.