为什么我的 PHP 函数返回两个结果和一个意外结果?
Why does my PHP function returned two result with one unexpected result?
这是一个从两个查询中获取文件的函数。当查询$pegawai->simpegFilePegawai()中不存在文件时,会继续在查询$pegawai->skpdSimpegFilePegawai()中查找。
我预计结果是 "file_id":1729467
的对象。你可以在调试结果中看到。
然而,正如我们在调试结果中看到的那样,该函数返回了另一个结果,即空数组。
我不明白,为什么我的函数返回两个结果?。你能解释一下为什么吗,我应该怎么做才能解决这个问题。
代码:
public static function getFileSerdikTerakhir(Pegawai $pegawai, $stagging = false) {
$query = $pegawai->riwayatSertifikat();
if ($stagging) {
$query = $pegawai->skpdRiwayatSertifikat();
}
$serdik = $query->where('nama_sertifikat', 'ilike', "%sertifikat pendidik%")
->orderByDesc('tanggal_sertifikat')
->get();
$info = [];
foreach ($serdik as $key => $item) {
$query = $pegawai->simpegFilePegawai();
if ($stagging) {
$query = $pegawai->skpdSimpegFilePegawai();
}
$info = $query->where('file_lokasi', 'ilike', "%[{$item->sertifikat_id}] Sertifikat%")->first();
Log::debug('staging');
Log::debug($stagging);
Log::debug('end staging');
Log::debug('info foreach');
Log::debug($info);
Log::debug('end info foreach');
if ($info) break;
}
if (empty($info) && ! $stagging) {
Log::debug('empty info');
SyaratPengajuan::getFileSerdikTerakhir($pegawai, true);
}
Log::debug('----return info----');
Log::debug($info);
Log::debug('----end return info----');
return $info;
}
调试结果:
[2021-04-16 08:19:46] staging.DEBUG: empty info
[2021-04-16 08:19:46] staging.DEBUG: staging
[2021-04-16 08:19:46] staging.DEBUG: 1
[2021-04-16 08:19:46] staging.DEBUG: end staging
[2021-04-16 08:19:46] staging.DEBUG: info foreach
[2021-04-16 08:19:46] staging.DEBUG: {"file_id":1729467,"peg_id":197805022009012001,"file_nama":"[6950] Sertifikat","file_lokasi":"197805022009012001\/197805022009012001_[6950] Sertifikat.pdf","file_ket":"Sertifikat","file_tgl":"2021-04-16T14:22:10.000000Z","created_at":null,"updated_at":"2021-04-16T07:22:10.472371Z","create_username":null,"update_username":null,"m_spg_file_pegawai_id":40,"entity_id":6950}
[2021-04-16 08:19:46] staging.DEBUG: end info foreach
[2021-04-16 08:19:46] staging.DEBUG: ----return info----
[2021-04-16 08:19:46] staging.DEBUG: {"file_id":1729467,"peg_id":197805022009012001,"file_nama":"[6950] Sertifikat","file_lokasi":"197805022009012001\/197805022009012001_[6950] Sertifikat.pdf","file_ket":"Sertifikat","file_tgl":"2021-04-16T14:22:10.000000Z","created_at":null,"updated_at":"2021-04-16T07:22:10.472371Z","create_username":null,"update_username":null,"m_spg_file_pegawai_id":40,"entity_id":6950}
[2021-04-16 08:19:46] staging.DEBUG: ----end return info----
[2021-04-16 08:19:46] staging.DEBUG: ----return info----
[2021-04-16 08:19:46] staging.DEBUG: array (
)
[2021-04-16 08:19:46] staging.DEBUG: ----end return info----
您看到两个 returns 的原因很简单 - 您的函数调用自身!
从调试信息中,我们可以看到以下内容:
第一次 运行s,$info
必须为空,所以它进入 if
块(因为我们在日志中看到 empty info
)。
此时,函数 再次调用自身 。因此,下一个日志块(从 staging
到我们第一次看到 ----end return info----
)全部来自函数的第二个 运行。
然而,一旦完成,它 returns 控制第一个 运行 - 因为 $info
在那个版本中仍然是空的,你会看到第二个 ----return info----
日志,和空数组。
这就解释了你所看到的。但我怀疑您错过了一些东西 - 除非您要对它的数据做一些事情,否则再次调用您的函数没有什么意义 returns。目前您的代码忽略了函数的第二次调用返回的内容 - 即使那是包含数据的那个!
你应该改变这个:
SyaratPengajuan::getFileSerdikTerakhir($pegawai, true);
对此:
$info = SyaratPengajuan::getFileSerdikTerakhir($pegawai, true);
这将使用从第二个 运行 返回的数据填充函数第一个 运行 中的 $info
,从而为原始调用者提供正确的数据(以及就像用数据填充日志一样)。
这是一个从两个查询中获取文件的函数。当查询$pegawai->simpegFilePegawai()中不存在文件时,会继续在查询$pegawai->skpdSimpegFilePegawai()中查找。
我预计结果是 "file_id":1729467
的对象。你可以在调试结果中看到。
然而,正如我们在调试结果中看到的那样,该函数返回了另一个结果,即空数组。
我不明白,为什么我的函数返回两个结果?。你能解释一下为什么吗,我应该怎么做才能解决这个问题。
代码:
public static function getFileSerdikTerakhir(Pegawai $pegawai, $stagging = false) {
$query = $pegawai->riwayatSertifikat();
if ($stagging) {
$query = $pegawai->skpdRiwayatSertifikat();
}
$serdik = $query->where('nama_sertifikat', 'ilike', "%sertifikat pendidik%")
->orderByDesc('tanggal_sertifikat')
->get();
$info = [];
foreach ($serdik as $key => $item) {
$query = $pegawai->simpegFilePegawai();
if ($stagging) {
$query = $pegawai->skpdSimpegFilePegawai();
}
$info = $query->where('file_lokasi', 'ilike', "%[{$item->sertifikat_id}] Sertifikat%")->first();
Log::debug('staging');
Log::debug($stagging);
Log::debug('end staging');
Log::debug('info foreach');
Log::debug($info);
Log::debug('end info foreach');
if ($info) break;
}
if (empty($info) && ! $stagging) {
Log::debug('empty info');
SyaratPengajuan::getFileSerdikTerakhir($pegawai, true);
}
Log::debug('----return info----');
Log::debug($info);
Log::debug('----end return info----');
return $info;
}
调试结果:
[2021-04-16 08:19:46] staging.DEBUG: empty info
[2021-04-16 08:19:46] staging.DEBUG: staging
[2021-04-16 08:19:46] staging.DEBUG: 1
[2021-04-16 08:19:46] staging.DEBUG: end staging
[2021-04-16 08:19:46] staging.DEBUG: info foreach
[2021-04-16 08:19:46] staging.DEBUG: {"file_id":1729467,"peg_id":197805022009012001,"file_nama":"[6950] Sertifikat","file_lokasi":"197805022009012001\/197805022009012001_[6950] Sertifikat.pdf","file_ket":"Sertifikat","file_tgl":"2021-04-16T14:22:10.000000Z","created_at":null,"updated_at":"2021-04-16T07:22:10.472371Z","create_username":null,"update_username":null,"m_spg_file_pegawai_id":40,"entity_id":6950}
[2021-04-16 08:19:46] staging.DEBUG: end info foreach
[2021-04-16 08:19:46] staging.DEBUG: ----return info----
[2021-04-16 08:19:46] staging.DEBUG: {"file_id":1729467,"peg_id":197805022009012001,"file_nama":"[6950] Sertifikat","file_lokasi":"197805022009012001\/197805022009012001_[6950] Sertifikat.pdf","file_ket":"Sertifikat","file_tgl":"2021-04-16T14:22:10.000000Z","created_at":null,"updated_at":"2021-04-16T07:22:10.472371Z","create_username":null,"update_username":null,"m_spg_file_pegawai_id":40,"entity_id":6950}
[2021-04-16 08:19:46] staging.DEBUG: ----end return info----
[2021-04-16 08:19:46] staging.DEBUG: ----return info----
[2021-04-16 08:19:46] staging.DEBUG: array (
)
[2021-04-16 08:19:46] staging.DEBUG: ----end return info----
您看到两个 returns 的原因很简单 - 您的函数调用自身!
从调试信息中,我们可以看到以下内容:
第一次 运行s,$info
必须为空,所以它进入 if
块(因为我们在日志中看到 empty info
)。
此时,函数 再次调用自身 。因此,下一个日志块(从 staging
到我们第一次看到 ----end return info----
)全部来自函数的第二个 运行。
然而,一旦完成,它 returns 控制第一个 运行 - 因为 $info
在那个版本中仍然是空的,你会看到第二个 ----return info----
日志,和空数组。
这就解释了你所看到的。但我怀疑您错过了一些东西 - 除非您要对它的数据做一些事情,否则再次调用您的函数没有什么意义 returns。目前您的代码忽略了函数的第二次调用返回的内容 - 即使那是包含数据的那个!
你应该改变这个:
SyaratPengajuan::getFileSerdikTerakhir($pegawai, true);
对此:
$info = SyaratPengajuan::getFileSerdikTerakhir($pegawai, true);
这将使用从第二个 运行 返回的数据填充函数第一个 运行 中的 $info
,从而为原始调用者提供正确的数据(以及就像用数据填充日志一样)。