Выполнение SQL-запроса внутри цикла - PullRequest
0 голосов
/ 25 марта 2019

Я сохраняю массив в сеансе для легкого извлечения и работы.

$responses = session('get_all_response');

$ ответов содержит максимум 30 записей.

  • Я стремился ускорить передачу данных в массив. Потому что, если у меня есть 10 записей в $ response (массив), потребуется 30 секунд, чтобы загрузить всю возможную информацию, касающуюся каждого содержимого этого массива (но на самом деле это так. Количество записей в массиве, скорее всего, максимум 30)

I цикл внутри массива

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 Ответ

1 голос
/ 25 марта 2019

Я не знаком с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...