在循环内运行SQL查询

时间:2019-03-25 03:08:45

标签: php laravel eloquent

我将数组存储到会话中,以便于检索和工作。

$responses = session('get_all_response');

$ responses最多包含30条记录。

  • 我的目标是使数据更快地推入阵列。因为如果我在$ responses(数组)中有10条记录,则需要30秒的时间来加载有关该数组每个内容的所有可能的信息(但实际情况是。数组中的记录数很有可能是30个最大值)

我在数组内循环

foreach($responses as $res)
{
    $bo_images = DB::select('SELECT 
    image.bo_hotel_code, 
    image.bo_image_type_code, 
    image.bo_path, 
    imagetypes.bo_content_imagetype_description 

    FROM 

    bo_images AS image

    RIGHT JOIN bo_content_imagetypes AS imagetypes
    ON imagetypes.bo_content_imagetype_code = image.bo_image_type_code

    WHERE image.bo_hotel_code = "'.$res['code'].'" AND image.bo_image_type_code = "COM" LIMIT 1');

    if($bo_images != null)
    {
        foreach($bo_images as $row)
        {
            $responses[$res['code']]['information']['bo_images'] = array(
                'image_type_code' => $row->bo_image_type_code,
                'image_path' => 'http://photos.hotelbeds.com/giata/'.$row->bo_path,
                'image_type_description' => $row->bo_content_imagetype_description,
            );
        }
    }

    $bo_categories = DB::select('SELECT 

    a.category_code,
    b.bo_content_category_description

    FROM 

    bo_hotel_contents AS a 

    RIGHT JOIN bo_content_categories AS b
    ON b.bo_content_category_code = a.category_code

    WHERE a.hotel_code= "'.$res['code'].'"');

    if($bo_categories != null)
    {
        foreach($bo_categories as $row)
        {

            $responses[$res['code']]['information']['rating'] = array(
                'description' => $row->bo_content_category_description,
            );
        }
    }
}
  • 在每个循环中,都有一个代码,其中包含用于获取数据库内部内容的密钥。

  • 然后,它将把等于数组索引的内容压入该数组。


否则。这是成功的。但是我知道这不是正确的方法。我知道这样做要好得多。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

我对Laravel不熟悉,所以我不知道预准备语句是否可以使用它,但是您应该做一些清理工作和/或验证$res['code']以确保它是整数,并假设那就是应该的。

首先,为WHERE IN子句准备一个字符串。

$str = "";
foreach ($responses as $res){
    $str .= ','.$res['code'];
}  
$str = substr($str,1); // to remove the comma

然后,您需要更改查询以使用IN语句。

WHERE a.hotel_code IN({$str})

我猜image.bo_hotel_code是指$res['code']。但是如果没有,您可以修改SELECT语句(如果有内存的话):

$code = $res['code'];
SELECT {$code} as code, 
    image.bo_hotel_code, 
    image.bo_image_type_code, 
    ...

然后,您将遍历结果并将其以相同的方式放入数组,其中$row['code']表示用于选择结果的代码。它应该比运行重复查询快得多,并且IN语句中的每个代码应该有一行。