Jump to content
Dimasscus

сформировать запрос для получения значений из таблицы "product" в списке заказов в личном кабинете покуателя

Recommended Posts

Всем привет.  разбираюсь с проблемой- в истории заказов в личном кабинете вывести поле mpn товара получилось. но в списке заказов не удается. возможно кто то подскажет, как изменить запрос,

 $order_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "order` WHERE order_id = '" . (int)$order_id . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND order_status_id > '0'");

чтобы он подтягивал данные таблицы product?

спасибо

Share this post


Link to post
Share on other sites

Добрый день.

Можно вот так:

$order_product_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_product op LEFT JOIN " . DB_PREFIX . "product p ON (op.product_id = p.product_id) WHERE op.order_id = '" . (int)$order_id . "'");

 

Share this post


Link to post
Share on other sites

Если это в списке заказов,  то для каждого заказа делаем такой запрос.

Share this post


Link to post
Share on other sites
7 минут назад, mpn2005 сказал:

Если это в списке заказов,  то для каждого заказа делаем такой запрос.

спасибо что откликнулись. суть в чем- вот так я получаю данные из таблицы order

model 

class ModelAccountOrder extends Model {
	public function getOrder($order_id) {
		$order_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "order` WHERE order_id = '" . (int)$order_id . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND order_status_id > '0'");

		if ($order_query->num_rows) {
			$country_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "country` WHERE country_id = '" . (int)$order_query->row['payment_country_id'] . "'");

			if ($country_query->num_rows) {
				$payment_iso_code_2 = $country_query->row['iso_code_2'];
				$payment_iso_code_3 = $country_query->row['iso_code_3'];
			} else {
				$payment_iso_code_2 = '';
				$payment_iso_code_3 = '';
			}

			$zone_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "zone` WHERE zone_id = '" . (int)$order_query->row['payment_zone_id'] . "'");

			if ($zone_query->num_rows) {
				$payment_zone_code = $zone_query->row['code'];
			} else {
				$payment_zone_code = '';
			}

			$country_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "country` WHERE country_id = '" . (int)$order_query->row['shipping_country_id'] . "'");

			if ($country_query->num_rows) {
				$shipping_iso_code_2 = $country_query->row['iso_code_2'];
				$shipping_iso_code_3 = $country_query->row['iso_code_3'];
			} else {
				$shipping_iso_code_2 = '';
				$shipping_iso_code_3 = '';
			}

			$zone_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "zone` WHERE zone_id = '" . (int)$order_query->row['shipping_zone_id'] . "'");

			if ($zone_query->num_rows) {
				$shipping_zone_code = $zone_query->row['code'];
			} else {
				$shipping_zone_code = '';
			}

			return array(
				'order_id'                => $order_query->row['order_id'],
				'invoice_no'              => $order_query->row['invoice_no'],
				'invoice_prefix'          => $order_query->row['invoice_prefix'],
				'store_id'                => $order_query->row['store_id'],
				'store_name'              => $order_query->row['store_name'],
				'store_url'               => $order_query->row['store_url'],
				'customer_id'             => $order_query->row['customer_id'],
				'firstname'               => $order_query->row['firstname'],
				'lastname'                => $order_query->row['lastname'],
				'telephone'               => $order_query->row['telephone'],
				'email'                   => $order_query->row['email'],
				'payment_firstname'       => $order_query->row['payment_firstname'],
				'payment_lastname'        => $order_query->row['payment_lastname'],
				'payment_company'         => $order_query->row['payment_company'],
				'payment_address_1'       => $order_query->row['payment_address_1'],
				'payment_address_2'       => $order_query->row['payment_address_2'],
				'payment_postcode'        => $order_query->row['payment_postcode'],
				'payment_city'            => $order_query->row['payment_city'],
				'payment_zone_id'         => $order_query->row['payment_zone_id'],
                'payment_zone'            => $order_query->row['payment_zone'],
                'payment_custom_field'    => $order_query->row['payment_custom_field'],
				'payment_zone_code'       => $payment_zone_code,
				'payment_country_id'      => $order_query->row['payment_country_id'],
				'payment_country'         => $order_query->row['payment_country'],
				'payment_iso_code_2'      => $payment_iso_code_2,
				'payment_iso_code_3'      => $payment_iso_code_3,
				'payment_address_format'  => $order_query->row['payment_address_format'],
				'payment_method'          => $order_query->row['payment_method'],
				'shipping_firstname'      => $order_query->row['shipping_firstname'],
				'shipping_lastname'       => $order_query->row['shipping_lastname'],
				'shipping_company'        => $order_query->row['shipping_company'],
				'shipping_address_1'      => $order_query->row['shipping_address_1'],
				'shipping_address_2'      => $order_query->row['shipping_address_2'],
				'shipping_postcode'       => $order_query->row['shipping_postcode'],
				'shipping_city'           => $order_query->row['shipping_city'],
				'shipping_zone_id'        => $order_query->row['shipping_zone_id'],
				'shipping_zone'           => $order_query->row['shipping_zone'],
				'shipping_zone_code'      => $shipping_zone_code,
				'shipping_country_id'     => $order_query->row['shipping_country_id'],
				'shipping_country'        => $order_query->row['shipping_country'],
				'shipping_iso_code_2'     => $shipping_iso_code_2,
				'shipping_iso_code_3'     => $shipping_iso_code_3,
				'shipping_address_format' => $order_query->row['shipping_address_format'],
				'shipping_method'         => $order_query->row['shipping_method'],
				'comment'                 => $order_query->row['comment'],
				'total'                   => $order_query->row['total'],
				'order_status_id'         => $order_query->row['order_status_id'],
				'language_id'             => $order_query->row['language_id'],
				'currency_id'             => $order_query->row['currency_id'],
				'currency_code'           => $order_query->row['currency_code'],
				'currency_value'          => $order_query->row['currency_value'],
				'date_modified'           => $order_query->row['date_modified'],
				'date_added'              => $order_query->row['date_added'],
				'ttn'              => $order_query->row['ttn'],
				'ttn_state'              => $order_query->row['ttn_state'],
				'ttnpay'              => $order_query->row['ttnpay'],
				'statedesk'              => $order_query->row['statedesk'],
				'shipttn'              => $order_query->row['shipttn'],
				'ip'                      => $order_query->row['ip']
			);
		} else {
			return false;
		}
	}

в controler я выбираю нужные мне данные для вывода в шаблон

foreach ($results as $result) {
			$product_total = $this->model_account_order->getTotalOrderProductsByOrderId($result['order_id']);
			$voucher_total = $this->model_account_order->getTotalOrderVouchersByOrderId($result['order_id']);

			//steelfeet Вызываем метод из модели
			$order_info = $this->model_account_order->getOrder($result['order_id']);
            
			$this->load->model('checkout/order');
			$data['orders'][] = array(
				'order_id'   => $result['order_id'],
				'ttn'         => $result['ttn'],
			    'ttn_state'      =>  ($result['ttn_state'] == '102' || $result['ttn_state'] == '103' ||$result['ttn_state'] == '108') ? $this->paymentform($result['ttn'], $result['shipttn'], $result['ttnpay']) : "-",
				'earnings' =>  $this->model_checkout_order->getEarnings($result['order_id'], $result['ttn_state'], $result['total']),
				'statedesk'   => $result['statedesk'],
				'shipttn'   => $result['shipttn'],
				'name'       => $order_info['payment_firstname'] . ' ' . $order_info['payment_lastname'],
				'telephone'       => $order_info['telephone'],
				'status'     => $result['status'],
				'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added'])),
				'products'   => ($product_total + $voucher_total),
				'total'      => $this->currency->format($result['total'], $result['currency_code'], $result['currency_value']),
				'view'       => $this->url->link('account/order/info', 'order_id=' . $result['order_id'], true),
			);
			
			}

но не могу придумать как мне к этим данным для каждого заказа передать данные, например из поля mpn 

подскажите пожалуйста

Share this post


Link to post
Share on other sites
4 минуты назад, Dimasscus сказал:

но не могу придумать как мне к этим данным для каждого заказа передать данные, например из поля mpn 

подскажите пожалуйста

Заказы - это заказы, а товары в заказе - это товары.

В одном заказе может быть 10 товаров с разными полями. Это поле не логично прикреплять к заказу. Его надо прикреплять к товару.

 

После строки:

$order_info = $this->model_account_order->getOrder($result['order_id']);

Получайте данные по товарам. Что-то вроде такого:

$order_products = $this->model_account_order->getOrderProduct($result['order_id']);

В модели у метода getOrderProduct надо будет добавить JOIN как писал выше.

 

И в контроллере перебирайте и доставайте нужные поля. Только надо учитывать, что товара может уже и не быть.

По хорошему нужные поля нужно тянуть в таблицу order_product.

 

9 минут назад, Dimasscus сказал:

$this->load->model('checkout/order');

Вот это в цикле вообще лишнее.

  • +1 1

Share this post


Link to post
Share on other sites
6 минут назад, mpn2005 сказал:

Заказы - это заказы, а товары в заказе - это товары.

В одном заказе может быть 10 товаров с разными полями. Это поле не логично прикреплять к заказу. Его надо прикреплять к товару.

 

После строки:

$order_info = $this->model_account_order->getOrder($result['order_id']);

Получайте данные по товарам. Что-то вроде такого:

$order_products = $this->model_account_order->getOrderProduct($result['order_id']);

В модели у метода getOrderProduct надо будет добавить JOIN как писал выше.

 

И в контроллере перебирайте и доставайте нужные поля. Только надо учитывать, что товара может уже и не быть.

По хорошему нужные поля нужно тянуть в таблицу order_product.

 

Вот это в цикле вообще лишнее.

суть в том что товар в заказе всегда 1 :)) такова специфика. и товар всегда есть в наличии. поэтому и решил тащить из таблицы товара. спасибо. сейчас попробую

Share this post


Link to post
Share on other sites
5 минут назад, Dimasscus сказал:

суть в том что товар в заказе всегда 1 :)) такова специфика. и товар всегда есть в наличии. поэтому и решил тащить из таблицы товара. спасибо. сейчас попробую

Так с этого и надо было начинать.

 

Тогда что-то вроде этого:

$order_query = $this->db->query("SELECT o.*, p.mpn FROM `" . DB_PREFIX . "order` o LEFT JOIN `" . DB_PREFIX . "order_product` op ON (o.order_id = op.order_id) LEFT JOIN `" . DB_PREFIX . "product` p ON (op.product_id = p.product_id) WHERE o.order_id = '" . (int)$order_id . "' AND o.customer_id = '" . (int)$this->customer->getId() . "' AND o.order_status_id > '0'");

Но я бы так всёравно не делал, а делал по человечески. Т.к. это получается костыль.

  • +1 1

Share this post


Link to post
Share on other sites
1 минуту назад, mpn2005 сказал:

Так с этого и надо было начинать.

 

Тогда что-то вроде этого:

$order_query = $this->db->query("SELECT o.*, p.mpn FROM `" . DB_PREFIX . "order` o LEFT JOIN `" . DB_PREFIX . "order_product` op ON (o.order_id = op.order_id) LEFT JOIN `" . DB_PREFIX . "product` p ON (op.product_id = p.product_id) WHERE o.order_id = '" . (int)$order_id . "' AND o.customer_id = '" . (int)$this->customer->getId() . "' AND o.order_status_id > '0'");

Но я бы так всёравно не делал, а делал по человечески. Т.к. это получается костыль.

да я б тоже. но на это поле уже завязано моб приложение, выгрузка в гугл таблицы и еще пара штуковин. так что легче сделать костыль чем перебрать все что там нахимичили

Share this post


Link to post
Share on other sites
1 минуту назад, Dimasscus сказал:

да я б тоже. но на это поле уже завязано моб приложение, выгрузка в гугл таблицы и еще пара штуковин. так что легче сделать костыль чем перебрать все что там нахимичили

Да проще не придумать в контроллере сделать так:

 

$order_mpn = '';

$order_products = $this->model_account_order->getOrderProduct($result['order_id']);

foreach ($order_products as $order_product) {
	if (!empty($order_product['mpn'])) {
		$order_mpn = $order_product['mpn'];
		break;
	}
}

 

  • +1 1

Share this post


Link to post
Share on other sites
3 минуты назад, mpn2005 сказал:

Так с этого и надо было начинать.

 

Тогда что-то вроде этого:

$order_query = $this->db->query("SELECT o.*, p.mpn FROM `" . DB_PREFIX . "order` o LEFT JOIN `" . DB_PREFIX . "order_product` op ON (o.order_id = op.order_id) LEFT JOIN `" . DB_PREFIX . "product` p ON (op.product_id = p.product_id) WHERE o.order_id = '" . (int)$order_id . "' AND o.customer_id = '" . (int)$this->customer->getId() . "' AND o.order_status_id > '0'");

Но я бы так всёравно не делал, а делал по человечески. Т.к. это получается костыль.

не хочу надоедать но 1 вопрос- ибо он меня тоже мучает, но пока до него не добрался. у модуля симпле есть запрос на получение данных поля в нужном месте. вот такой 

$query = $this->db->query('SELECT * FROM `' . DB_PREFIX . $object . '_simple_fields` WHERE `'.$object.'_id` = \'' . $objectId . '\' LIMIT 1');

как его переиначить, чтобы он не выводил значение- а записывал в таблицу данные? ну то есть не select а insert использовать?

Share this post


Link to post
Share on other sites

Тут уже от задачи зависит. Добавит дополнительных запросов.

Зато не будет приключений, если в заказе станет больше одного товара.

Share this post


Link to post
Share on other sites
6 минут назад, Dimasscus сказал:

как его переиначить, чтобы он не выводил значение- а записывал в таблицу данные? ну то есть не select а insert использовать?

А зачем туда что-то вставлять? Симпла сама с этим справляется.

Чтобы что-то туда вставить нужно чётко понимать, что у куда надо вставить. Выборка и вставка данных - это не одинаковые процессы.

Share this post


Link to post
Share on other sites
15 минут назад, mpn2005 сказал:

А зачем туда что-то вставлять? Симпла сама с этим справляется.

Чтобы что-то туда вставить нужно чётко понимать, что у куда надо вставить. Выборка и вставка данных - это не одинаковые процессы.

да по симпле-бог с ней. скорее всего я там переделаю чтоб юзалось поле из таблицы заказа а не из симплы. туда просто надо вписывать текстовые данные, время.зачем заюзано было это поле я сам не знаю:)) был в отпуске, по возвращении мне сообщили ,что уже создали в симпле поле, приципили к нему приложение, выгрузку- и осталось только мне теперь это реализовать заполнение этого поля (вывести в список заказов input и писать в базу). обновляться данные этого поле не будут- просто оно либо заполнено и содержит данные которые нельзя изменить,либо оно пустое.

 

я прошу еще пару минут внимания- не получилось все ж с тем мпн. получаю Undefined index: mpn in /

что сделал- в модели заменил запрос на тот что вы предложили, в запросах добавил 'mpn'              => $order_query->row['mpn'], 

в контролере 'mpn'         => $result['mpn'],

в шаблон <td class="pts-text-left">{{ order.mpn }} </td> 

моды обновил. в чем проблема- не пойму

Share this post


Link to post
Share on other sites
11 минут назад, Dimasscus сказал:

'mpn'         => $result['mpn'],

Тут ошибка.

Надо так:

'mpn'         => $order_info['mpn'],

Там же из $result только номер заказ берётся. По умолчанию там не все поля из заказа модель возвращает.

  • +1 1

Share this post


Link to post
Share on other sites

спасибо. все получилось.

но натусил новую траблу :(

создал в таблице order поле  datereturnpay https://clip2net.com/s/47SZtOn

в модели его позвал 'datereturnpay'    => $order_query->row['datereturnpay'],

в контролере указал 'datereturnpay'  => $order_info['datereturnpay'],

в твиге добавляю {{ order.datereturnpay }} - не выводится, но и ошибок нет

прописал {{ dump(order.datereturnpay) }}  получаю https://clip2net.com/s/47SZyDH

 

просто руки опустились и я хз что делать. в чем проблема не пойму вообще

Share this post


Link to post
Share on other sites

'datereturnpay'  => $result['datereturnpay'], поменял на result потому что все почти переменные там так подключаются и работают без ошибок- в итоге получаю Undefined index: datereturnpay in

Share this post


Link to post
Share on other sites
3 минуты назад, Dimasscus сказал:

'datereturnpay'  => $result['datereturnpay'],

Так неправильно. Все данные в массиве $order_info.

Сделайте в контроллере print_r($order_info)

И проверте, что возвращает модель.

  • +1 1

Share this post


Link to post
Share on other sites
46 минут назад, mpn2005 сказал:

Так неправильно. Все данные в массиве $order_info.

Сделайте в контроллере print_r($order_info)

И проверте, что возвращает модель.

действительно все именно так.

надо будет разобраться на досуге зачем же там столько выводом с ресультом.:))

принт выводит и в коде все отлично видно. единственная проблема осталась- в списке заказов я сделал кнопки для вызова модальных окон в строке каждого заказа. по клику должно открываться окно с данными по конкретному выбранному заказу сейчас для обоих модальных окон выводит данные первого заказа в списке. надо подумать как заставить выводить в модальном окне данные которые соответствуют выбранному заказу.

спасибо вам за помощь

Share this post


Link to post
Share on other sites
17 часов назад, mpn2005 сказал:

А зачем туда что-то вставлять? Симпла сама с этим справляется.

Чтобы что-то туда вставить нужно чётко понимать, что у куда надо вставить. Выборка и вставка данных - это не одинаковые процессы.

отказался от реализацией через поле в симпле. создал в ордере, все четко выводит. но возник вопрос- в функции public function getOrder($order_id) { есть запрос select который получает данные из нужных таблиц.. а как реализовать теперь запись из нужной переменной в таблицу? добавить запрос c insert для нужной таблицы ?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.