Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Нужна помощь по выборке данных с БД


Recommended Posts

Нужна помощь по php, сделать выборку данных. ocstore 2.3

есть две таблицы в БД
oc_zone, oc_pertners
В таблице oc_pertners данные партнеров, а в oc_zone регионы

Нужны выбрать всех партнеров прокрутить foreach, что бы результат был таким (партнеры разбиты по регионам):

Регоин А
партнер 1
партнер 2
партнер 3
----
Регоин В
Партнер 4
партнер 10
..
----

Надіслати
Поділитися на інших сайтах


1 hour ago, s89 said:

Нужны выбрать всех партнеров прокрутить foreach,

это не оптимально и медленно. Все решается одним sql-запросом вида

Spoiler

SELECT z.zone_id, p.name FROM oc_zone z JOIN oc_pertners p ON z.zone_id = p.zone_id GROUP BY z.zone_id;

где две таблицы связаны через zone_id. Просто замените красное name на название нужного Вам поля, которое содержит наименование партнера

 

Если будут сложности с адаптацией этого крошечного запроса, выполните в пхпмайадмине две команды: DESCRIBE oc_zone; DESCRIBE oc_pertners; и покажите здесь их результат - это поможет составить верный запрос

 

Надіслати
Поділитися на інших сайтах

21 час назад, 100napb сказал:

это не оптимально и медленно. Все решается одним sql-запросом вида

  Показать контент

SELECT z.zone_id, p.name FROM oc_zone z JOIN oc_pertners p ON z.zone_id = p.zone_id GROUP BY z.zone_id;

где две таблицы связаны через zone_id. Просто замените красное name на название нужного Вам поля, которое содержит наименование партнера

 

Если будут сложности с адаптацией этого крошечного запроса, выполните в пхпмайадмине две команды: DESCRIBE oc_zone; DESCRIBE oc_pertners; и покажите здесь их результат - это поможет составить верный запрос

 


В модель добавил Ваш запрос:

Спойлер

public function getPartnerss() {
	$query = $this->db->query("SELECT z.zone_id,z.name, p.pr_name,p.city, p.address, p.phone FROM " . DB_PREFIX . "zone z JOIN " . DB_PREFIX . "partners p ON z.zone_id = p.zone_id GROUP BY z.zone_id");
	return $query->rows; 
}

 

 

Контролер:

Спойлер

$data['partners'] = array();

$partners = $this->model_information_partners->getPartnerss();

foreach ($partners as $partner) {

	$children_data = array(); 

	$children = $this->model_information_partners->getPartnerss();	
	 
	foreach ($children as $child) {

		$children_data[] = array(
			'name' => $child['pr_name'],
			'contacts' => $child['city'], $child['address'], $child['phone']
		);
	}
	
	$data['partners'][] = array(
		'name'        => $partner['name'],
		'children'    => $children_data
	);
}

 


Шаблон думаю нет смысла показывать...
Результат такой:
Прокручиваются регионы правильно,
А партнеры нет. То есть партнеры одни и те же выходят для всех регионов. И количество их выходит равное количеству регионов.

Результат на скрине
 

Спойлер

image.thumb.png.0d58be26a0efd596551c0c1d6c74e077.png


Наверное нужно как то контролер переделать, может и немного сам запрос?

Змінено користувачем s89
Надіслати
Поділитися на інших сайтах


1 hour ago, s89 said:

Наверное нужно как то контролер переделать, может и немного сам запрос?

 

Вопрос с подвохом: а Вы смотрели результат выполнения sql-запроса в том же phpmyadmin'e, прежде чем выстраивать логику в контроллере основанную на вложенных циклах?

23 hours ago, 100napb said:
On 7/21/2020 at 3:51 PM, s89 said:

Нужны выбрать всех партнеров прокрутить foreach,

это не оптимально и медленно. Все решается одним sql-запросом вида

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

 

Вам просто надо распарсить результат $this->model_information_partners->getPartnerss(); в удобный для вывода в шаблоне массив и все.

  • +1 1
Надіслати
Поділитися на інших сайтах

1 час назад, 100napb сказал:

а Вы смотрели результат выполнения sql-запроса в том же phpmyadmin'e, прежде чем выстраивать логику в контроллере основанную на вложенных циклах?

 

Смотрел, там не все что нужно..
 

Спойлер

image.png.e745651971fe5d07e7d99cce1d3e5941.png


А в таблице oc_partners их 7 партнеров в 3-х регионах

 

Спойлер

image.png.362df5f1fafcebded602eaf0e19950ec.png

 

Надіслати
Поділитися на інших сайтах


2 hours ago, s89 said:

Смотрел, там не все что нужно..

Спасибо за скриншот. Действительно 

1 hour ago, Blast said:

 

убрать группировку по z.zone_id

 

И заменить на order by z.name, p.pr_name

Надіслати
Поділитися на інших сайтах

3 часа назад, 100napb сказал:

Спасибо за скриншот. Действительно 

И заменить на order by z.name, p.pr_name

Первое что хотел бы сказать, спасибо БОЛЬШОЕ что помогаете решить вопрос.
Но пока что не выходит, вероятно что я неправильно прокручиваю через foreach

Вот что выходит по запросу
 

Спойлер

image.png.99090889afa0d9b8c805c3786cb6eb62.png

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


контролер

Спойлер

$data['partners'] = array(); 
$partners = $this->model_information_partners->getPartnerss();

foreach ($partners as $partner) {

  $data['partners'][] = array(
    'name_region'        => $partner['name'],
    'name_partner'        => $partner['pr_name'],
    'contacts' => $partner['city'], $partner['address'], $partner['phone'] 
    );
}

 


Шаблон

Спойлер

<?php foreach ($partners as $partner) { ?>
        <div class="well_box" style="margin-bottom:20px;">
          <div class="headers"><?php echo $partner['name_region']; ?></div>
          <div class="box_part">
            <div class="partner_box">
              <div class="name_parnter">
                <?php echo $partner['name_partner']; ?>
              </div>
              <div class="address_parnter">
                <?php echo $partner['contacts']; ?>
              </div>
            </div> 
          </div>
        </div>  
      <?php } ?>

 


И вот результат:
 

Спойлер

image.thumb.png.44226c783191c5ae44de8281d68e7c7e.png

 

Змінено користувачем s89
Надіслати
Поділитися на інших сайтах


27 минут назад, s89 сказал:

Первое что хотел бы сказать, спасибо БОЛЬШОЕ что помогаете решить вопрос.
Но пока что не выходит, вероятно что я неправильно прокручиваю через foreach

Вот что выходит по запросу
 

  Показать контент

image.png.99090889afa0d9b8c805c3786cb6eb62.png

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


контролер

  Показать контент


$data['partners'] = array(); 
$partners = $this->model_information_partners->getPartnerss();

foreach ($partners as $partner) {

  $data['partners'][] = array(
    'name_region'        => $partner['name'],
    'name_partner'        => $partner['pr_name'],
    'contacts' => $partner['city'], $partner['address'], $partner['phone'] 
    );
}

 


Шаблон

  Показать контент


<?php foreach ($partners as $partner) { ?>
        <div class="well_box" style="margin-bottom:20px;">
          <div class="headers"><?php echo $partner['name_region']; ?></div>
          <div class="box_part">
            <div class="partner_box">
              <div class="name_parnter">
                <?php echo $partner['name_partner']; ?>
              </div>
              <div class="address_parnter">
                <?php echo $partner['contacts']; ?>
              </div>
            </div> 
          </div>
        </div>  
      <?php } ?>

 


И вот результат:
 

  Показать контент

image.thumb.png.44226c783191c5ae44de8281d68e7c7e.png

 

нужен вложенный массив партнеров, собственно как у вас в первом сообщении. Примерно может выглядеть так

'region' => 'Днепропетровская область',
'region_partners' => array(
	0 => array('name' => 'Партнер1', 'contacts' => 'адрес1'),
	1 => array('name' => 'Партнер2', 'contacts' => 'адрес2'),
),

 

 

Надіслати
Поділитися на інших сайтах

11 часов назад, Blast сказал:

нужен вложенный массив партнеров, собственно как у вас в первом сообщении. Примерно может выглядеть так


'region' => 'Днепропетровская область',
'region_partners' => array(
	0 => array('name' => 'Партнер1', 'contacts' => 'адрес1'),
	1 => array('name' => 'Партнер2', 'contacts' => 'адрес2'),
),

 


Сделал так

Спойлер

$data['partners'] = array();

$partners = $this->model_information_partners->getPartnerss();

		foreach ($partners as $partner) {

			$children_data = array(); 

			$children = $this->model_information_partners->getPartnerss();	
			 
			foreach ($children as $child) {

				$children_data[] = array(
					'name_partner' => $child['pr_name'],
					'contacts' => $child['city'], $child['address'], $child['phone']
				);
			}
			
			$data['partners'][] = array(
				'name_region'        => $partner['name'],
				'children'    => $children_data
			);
		}

 

 

 

Но что то так..))
 

Спойлер

image.thumb.png.08133e4eaf93c746f9b79dae4cda7707.png


Регионы повторно крутятся, а партнеры для всех регионов одни и те же..

Надіслати
Поділитися на інших сайтах


с чего вы взяли, что повторный вызов

$this->model_information_partners->getPartnerss();	

даст вам "дочерние" элементы?

в первом запросе вам вернутся все данные сразу. запускайте foreach по ним и раскидывайте данные в нужном формате

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.