几周以来,我在fetch_object(className:: class)
中使用了PHP中的预处理语句。我真的很喜欢这种方式,因为在我的控制器和视图(Twig)中都是自动完成的,但是有时候我需要一个内部联接(一对多)。
现在我像下面那样做。幸运的是,在我使用该项目的项目中,我只有少数结果,因此查询数量很少。但是总的来说,这将创建很多查询。为了提高性能,我将$ returnResult存储在控制器的apcu / Redis中,或者当我无法使用其他缓存方法时将其保存在JSON文件中。
我的问题是:我可以采用更好的方法来减少查询数量,但仍然使用fetch_object(className:: class)
预先感谢您的帮助。
public function getAll()
{
// Create database connection
$db = DB::connect();
$stmt = $db->prepare("SELECT * FROM dataroom_category ORDER BY display_order");
$stmt->execute();
$returnResult = [];
$categoryResult = $stmt->get_result();
$stmt2 = $db->prepare("SELECT * FROM dataroom_file WHERE dataroom_category_id = ? ORDER BY display_order");
$stmt2->bind_param('i', $id);
/** @var data $category */
while ($category = $categoryResult->fetch_object(data::class)) {
$id = $category->getId();
$stmt2->execute();
$filesResult = $stmt2->get_result();
while ($file = $filesResult->fetch_object(DataroomFile::class)) {
// Add the file to the setFiles array with $file->getid() as key
$category->setFiles($file);
}
// I noticed by using mysqli_free_result the server used alot less memory at the end
mysqli_free_result($filesResult);
$returnResult[$category->getId()] = $category;
}
mysqli_free_result($categoryResult);
$stmt2->close();
$stmt->close();
// Return the categories with the files for usage in the controller and view
return $returnResult;
}