gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:50:51 24 4
gpt4 key购买 nike

是否可以在 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

我有两个关系模型是 PendaftarProdiPenerima .

这是 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_1prody_pilihan_2pendaftar 中的外键表,该键引用自 ProdiPenerima table 。

最佳答案

$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'];
}

那是因为 asArray() 被使用,所以查询返回数组数组而不是模型数组。

如果你需要模型,你应该在模型中添加属性来存储子查询的结果:
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 $model) { 
echo $model->jum1;
}

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

关于yii2 - 使用 Yii2 ActiveRecord 在 SELECT 中进行子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50581521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com