Задать вопрос
@nevesomostjke

Как ускорить foreach?

Привет, есть вот у меня foreach в приложении laravel, точнее foreach в foreach.
Все что происходит, проверяется наличие товара по прайсу в базе. Из за этого, медленно очень загружается страница.

view:
@foreach ($parts as $part)
			<?php $aval = 0; ?>
			@foreach ($prices as $k=>$v)
			<?php
				
				// Поиск наличия
				$coem = str_replace(' ', '', $part->part_number);
				$poem = str_replace(' ', '', $v->oem);

				$coem = str_replace('-', '', $coem);
				$poem = str_replace('-', '', $poem);

				$coem = str_replace('-', '.', $coem);
				$poem = str_replace('-', '.', $poem);

				$coem = str_replace('(', '.', $coem);
				$poem = str_replace('(', '.', $poem);

				$coem = str_replace(')', '.', $coem);
				$poem = str_replace(')', '.', $poem);	

				$sim = similar_text($coem, $poem, $perc);
				if ($perc==100) { 
					if ($v->count >= 1) {
						$aval = 1;
						break;
					}
				}
				?>
			@endforeach


Вот контроллер:
// Получаем характеристики продукта
                    $attributes = DB::table('article_attributes')
                    ->where('datasupplierarticlenumber', '=', $request->part_number)
                    ->where('supplierid', '=', $supplier->id)
                    ->get();

                    // Название изделия (есть еще статус изделия и не только см. таблицу articles)
                    $article = DB::table('articles')
                    ->select('NormalizedDescription', 'ArticleStateDisplayValue')
                    ->where('DataSupplierArticleNumber', '=', $request->part_number)
                    ->where('supplierid', '=', $supplier->id)
                    ->first();

                    // Файлы продукта
                    $files = DB::table('article_images')
                    ->select('Description', 'PictureName')
                    ->where('DataSupplierArticleNumber', '=', $request->part_number)
                    ->where('supplierId', '=', $supplier->id)
                    ->get();

                    // Применимость изделия
                    $result = [];
                    $rows = DB::table('article_li')
                    ->select('linkageTypeId', 'linkageId')
                    ->where('DataSupplierArticleNumber', '=', $request->part_number)
                    ->where('supplierId', '=', $supplier->id)
                    ->get();
                    
                    // разбор
                    foreach ($rows as &$row) {
                        $result[]= DB::select("SELECT DISTINCT p.id, mm.description make, m.description model, p.constructioninterval, p.description FROM passanger_cars p 
                        JOIN models m ON m.id=p.modelid
                        JOIN manufacturers mm ON mm.id=m.manufacturerid
                        WHERE p.id=" . $row->linkageId);
                    }

                    // Массив с информацией о товаре
                    $info = array(
                        "part_number" => $request->part_number, // OEM номер
                        "supplier_name" => $request->supplier_name, // Имя производителя
                        "supplier_id" => $supplier->id, // ID производителя
                    );

                    // Выгружаем прайсы
                    $prices = DB::table('prices')
                    ->select('oem', 'price', 'count', 'stock')
                    ->get();
  • Вопрос задан
  • 334 просмотра
Подписаться 1 Простой 7 комментариев
Пригласить эксперта
Ответы на вопрос 1
tmaslov22
@tmaslov22
Backend developer
Проверять наличие товара по прайсу в базе нужно через SQL запрос. В этом примере тянутся данные из нескольких таблиц БД и потом через php производятся вычисления. Нужно что бы вычисления делала СУБД, а не PHP.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы