@WebforSelf

Как изменить запрос mysql?

Есть импорт на php , который импортирует товары.
Сам файл Импорта

<?php
require_once('../../api/Simpla.php');
class ImportAjax extends Simpla
{	

	{
		if(!$this->managers->access('import'))
			return false;
		// Для корректной работы установим локаль UTF-8
		setlocale(LC_ALL, 'ru_RU.UTF-8');
		$result = new stdClass;
		// Определяем колонки из первой строки файла
		$f = fopen($this->import_files_dir.$this->import_file, 'r');
		$this->columns = fgetcsv($f, null, $this->column_delimiter);
		// Заменяем имена колонок из файла на внутренние имена колонок
		foreach($this->columns as &$column)
		{ 
			if($internal_name = $this->internal_column_name($column))
			{
				$this->internal_columns_names[$column] = $internal_name;
				$column = $internal_name;
			}
		}
		// Если нет названия товара - не будем импортировать
		if(!in_array('name', $this->columns) && !in_array('sku', $this->columns))
			return false;
		// Переходим на заданную позицию, если импортируем не сначала
		if($from = $this->request->get('from'))
			fseek($f, $from);
		// Массив импортированных товаров
		$imported_items = array();	
		// Проходимся по строкам, пока не конец файла
		// или пока не импортировано достаточно строк для одного запроса
		for($k=0; !feof($f) && $k<$this->products_count; $k++)
		{ 
			// Читаем строку
			$line = fgetcsv($f, 0, $this->column_delimiter);
			$product = null;			
			if(is_array($line))			
			// Проходимся по колонкам строки
			foreach($this->columns as $i=>$col)
			{
				// Создаем массив item[название_колонки]=значение
 				if(isset($line[$i]) && !empty($line) && !empty($col))
					$product[$col] = $line[$i];
			}
			// Импортируем этот товар
	 		if($imported_item = $this->import_item($product))
				$imported_items[] = $imported_item;
		}
		// Запоминаем на каком месте закончили импорт
 		$from = ftell($f);
 		// И закончили ли полностью весь файл
 		$result->end = feof($f);
		fclose($f);
		$size = filesize($this->import_files_dir.$this->import_file);
		// Создаем объект результата
		$result->from = $from;          // На каком месте остановились
		$result->totalsize = $size;     // Размер всего файла
		$result->items = $imported_items;   // Импортированные товары
		return $result;
	}
	// Импорт одного товара $item[column_name] = value;
	private function import_item($item)
	{
		$imported_item = new stdClass;
		// Проверим не пустое ли название и артинкул (должно быть хоть что-то из них)
		if(empty($item['name']) && empty($item['sku']))
			return false;
		// Подготовим товар для добавления в базу
		$product = array();
		if(isset($item['name']))
			$product['name'] = trim($item['name']);
		if(isset($item['meta_title']))
			$product['meta_title'] = trim($item['meta_title']);
		if(isset($item['meta_keywords']))
			$product['meta_keywords'] = trim($item['meta_keywords']);
		if(isset($item['meta_description']))
			$product['meta_description'] = trim($item['meta_description']);
		if(isset($item['annotation']))
			$product['annotation'] = trim($item['annotation']);
		if(isset($item['description']))
			$product['body'] = trim($item['description']);
		if(isset($item['visible']))
			$product['visible'] = intval($item['visible']);
		if(isset($item['featured']))
			$product['featured'] = intval($item['featured']);
		if(!empty($item['url']))
			$product['url'] = trim($item['url']);
		elseif(!empty($item['name']))
			$product['url'] = $this->translit($item['name']);

		// Подготовим вариант товара
		$variant = array();
		if(isset($item['variant']))
			$variant['name'] = trim($item['variant']);
		if(isset($item['price']))
			$variant['price'] = str_replace(',', '.', str_replace(' ', '', trim($item['price'])));
		if(isset($item['compare_price']))
			$variant['compare_price'] = trim($item['compare_price']);
		if(isset($item['stock']))
			if($item['stock'] == '')
				$variant['stock'] = null;
			else
				$variant['stock'] = trim($item['stock']);
		if(isset($item['sku']))
			$variant['sku'] = trim($item['sku']);
		// Если задан артикул варианта, найдем этот вариант и соответствующий товар
		if(!empty($variant['sku']))
		{ 
			$this->db->query('SELECT v.id as variant_id, v.product_id FROM __variants v, __products p WHERE v.sku=? AND v.product_id = p.id LIMIT 1', $variant['sku']);
			$result = $this->db->result();
			if($result)
			{
				// и обновим товар
				if(!empty($product))
					$this->products->update_product($result->product_id, $product);
				// и вариант
				if(!empty($variant))
					$this->variants->update_variant($result->variant_id, $variant);
				$product_id = $result->product_id;
				$variant_id = $result->variant_id;
				// Обновлен
				$imported_item->status = 'updated';
			}
		}
		// Если на прошлом шаге товар не нашелся, и задано хотя бы название товара
		if((empty($product_id) || empty($variant_id)) && isset($item['name']))
		{
			if(!empty($variant['sku']) && empty($variant['name']))
				$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id WHERE v.sku=? LIMIT 1', $variant['sku']);			
			elseif(isset($item['variant']))
				$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id AND v.name=? WHERE p.name=? LIMIT 1', $item['variant'], $item['name']);
			else
				$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id WHERE p.name=? LIMIT 1', $item['name']);			
			$r =  $this->db->result();
			if($r)
			{
				$product_id = $r->product_id;
				$variant_id = $r->variant_id;
			}
			// Если вариант найден - обновляем,
			if(!empty($variant_id))
			{
				$this->variants->update_variant($variant_id, $variant);
				$this->products->update_product($product_id, $product);				
				$imported_item->status = 'updated';		
			}
			// Иначе - добавляем
			elseif(empty($variant_id))
			{
				if(empty($product_id))
					$product_id = $this->products->add_product($product);
                $this->db->query('SELECT max(v.position) as pos FROM __variants v WHERE v.product_id=? LIMIT 1', $product_id);
                $pos =  $this->db->result('pos');
				$variant['position'] = $pos+1;
				$variant['product_id'] = $product_id;
				$variant_id = $this->variants->add_variant($variant);
				$imported_item->status = 'added';
			}
		}
		if(!empty($variant_id) && !empty($product_id))
		{
			// Нужно вернуть обновленный товар
			$imported_item->variant = $this->variants->get_variant(intval($variant_id));			
			$imported_item->product = $this->products->get_product(intval($product_id));						
			// Добавляем категории к товару
			if(!empty($categories_ids))
				foreach($categories_ids as $c_id)
					$this->categories->add_product_category($product_id, $c_id);
	 		// Изображения товаров
	 		if(isset($item['images']))
	 		{
	 			// Изображений может быть несколько, через запятую
	 			$images = explode(',', $item['images']);
	 			foreach($images as $image)
	 			{
	 				$image = trim($image);
	 				if(!empty($image))
	 				{
		 				// Имя файла
						$image_filename = pathinfo($image, PATHINFO_BASENAME);
		 				// Добавляем изображение только если такого еще нет в этом товаре
						$this->db->query('SELECT filename FROM __images WHERE product_id=? AND (filename=? OR filename=?) LIMIT 1', $product_id, $image_filename, $image);
						if(!$this->db->result('filename'))
						{
							$this->products->add_image($product_id, $image);
						}
					}
	 			}
	 		}	
 		return $imported_item;
	 	}	
	}

}


Проблема такая, сейчас в базе есть товары у которых нет артикула.
Добавил в csv артикул, и при обновлении он товары с артикулом добавляет как новые, а хотелось бы чтоб по названию товара он обновлял товар , просто добавляя артикул.
Проблема кроется вот в этом кусочке кода,
// Если задан артикул варианта, найдем этот вариант и соответствующий товар
		if(!empty($variant['sku']))
		{ 
			$this->db->query('SELECT v.id as variant_id, v.product_id FROM __variants v, __products p WHERE v.sku=? AND v.product_id = p.id LIMIT 1', $variant['sku']);
			$result = $this->db->result();
			if($result)
			{
				// и обновим товар
				if(!empty($product))
					$this->products->update_product($result->product_id, $product);
				// и вариант
				if(!empty($variant))
					$this->variants->update_variant($result->variant_id, $variant);
				
				$product_id = $result->product_id;
				$variant_id = $result->variant_id;
				// Обновлен
				$imported_item->status = 'updated';
			}
		}

а точнее в запросе mysql,
$this->db->query('SELECT v.id as variant_id, v.product_id FROM __variants v, __products p WHERE v.sku=? AND v.product_id = p.id LIMIT 1', $variant['sku']);

только не могу понять как его изменить чтоб при наличии артикула, товар обновлялся а не добавлялся новый.
то есть на сайте товар "test" а в csv тоже test , но с полем артикул (777) - создает новый товар а не обновляет.
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
@WebforSelf Автор вопроса
if(!empty($variant['sku']) && empty($variant['name']))
$this->db->query('SELECT v.id as variant_id, p.id as product_id FROM __products p LEFT JOIN __variants v ON v.product_id=p.id WHERE p.name=? LIMIT 1', $item['name']);


Проблему решил путем замены данного запроса , вопрос закрыт
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
21 окт. 2020, в 13:59
1000 руб./в час
21 окт. 2020, в 13:40
35000 руб./за проект
21 окт. 2020, в 13:24
700 руб./за проект