Выбор из нескольких таблиц БД при условии заполнения полей на фронтенде

  • 2 Ответов
  • 205 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

voron121

  • ****
  • 222
  • + 1 -
  • Метод тыка и мата помогает в кодинге
Доброго времени суток уважаемые форумчане. Челом бью, помощи прошу и наставления. Суть вопроса такова : есть форма на фронтенде сайта, которая работает по аналогии с фильтром товара. В связи с этим в модели есть вот такой запрос в БД:

Код: php

protected function getListQuery() {
$jinput = JFactory::getApplication()->input;
$formdata = $jinput->get('jform', '', 'array');

$this->setState( 'list.start', 0 );
$this->setState( 'list.limit', 200 ); // лимит вывода

if ($formdata['valute'] == '1') {
$price = "`price`";
}elseif ($formdata['valute'] == '2') {
$price = "price2";
}elseif ($formdata['valute'] == '3') {
$price = "price3";
}

  if($formdata != NULL ) {
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);
    $query->select('*');
    $query->from('`#__tour`');
   
    if ($formdata['strana_tour'] != NULL) {
    $query->where('`strana_tour` = '. $db->quote($formdata['strana_tour']));
    }

    if ($formdata['strana_ot'] != NULL) {
    $query->where('`strana_ot` = '. $db->quote($formdata['strana_ot']));
    }
 
  if ($formdata['start_date'] != NULL and empty($formdata['end_date'])) {
  $query->where('`start_date` >= '. $db->quote($formdata['start_date']));
  }
 
  if ($formdata['end_date'] != NULL and empty($formdata['start_date'])) {
  $query->where('`end_date` >= '. $db->quote($formdata['end_date']));
  }

  if ($formdata['start_date'] != NULL and $formdata['end_date'] != NULL) {
  $query->where('`start_date` >= '. $db->quote($formdata['start_date']));
    $query->where('`end_date` <= '. $db->quote($formdata['end_date']));
  }

  if ($formdata['vzroslie'] != NULL and empty($formdata['deti'])) {
  $query->where('`vzroslie` >= '. $db->quote($formdata['vzroslie']));
  }
 
  if ($formdata['deti'] != NULL and empty($formdata['vzroslie'])) {
  $query->where('`deti` >= '. $db->quote($formdata['deti']));
  }

  if ($formdata['vzroslie'] != NULL and $formdata['deti'] != NULL) {
  $query->where('`vzroslie` >= '. $db->quote($formdata['vzroslie']));
    $query->where('`deti` >= '. $db->quote($formdata['deti']));
  }

  if ($formdata['night_start'] != NULL and empty($formdata['night_end'])) {
  $query->where('`night` >= '. $formdata['night_start']);
  }
 
  if ($formdata['night_end'] != NULL and empty($formdata['night_start'])) {
  $query->where('`night` >= '. $formdata['night_end']);
  }

  if ($formdata['night_start'] != NULL and $formdata['night_end'] != NULL) {
  $query->where('`night` >= '. $formdata['night_start']);
    $query->where('`night` <= '. $formdata['night_end']);
  }

  if (!empty($formdata['sp_inp']) and empty($formdata['ep_inp'])) {
  $query->where( $price . ' >= ' . $formdata['sp_inp']);
  }

  if (empty($formdata['sp_inp']) and !empty($formdata['ep_inp'])) {
  $query->where( $price . ' <= ' . $formdata['ep_inp']);
  }

  if ($formdata['sp_inp'] != NULL and $formdata['ep_inp'] != NULL) {
  $query->where( $price . ' >= ' . $formdata['sp_inp']);
  $query->where( $price . ' <= ' . $formdata['ep_inp']);
  }

  if ($formdata['eat'] != NULL) {
  $query->where( 'eat  IN ( ' .  "'" . implode("', '",  $formdata['eat']). "'" .' )');
  }

  if ($formdata['star'] != NULL) {
  $query->where( 'star  IN ( ' .  "'" . implode("', '",  $formdata['star']). "'" .' )');
  }

  if ($formdata['resort'] != NULL) {
  $query->where( 'resort  IN ( ' .  "'" . implode("', '",  $formdata['resort']). "'" .' )');
  }

  if ($formdata['hotels'] != NULL) {
  $query->where( 'otel  IN ( ' .  "'" . implode("', '",  $formdata['hotels']). "'" .' )');
  }

    if (JLanguageMultilang::isEnabled()) {
    $query->where('language in (' . $db->quote(JFactory::getLanguage()->getTag()). ',' . $db->quote('*'). ')');
    }   

    $query->where('`published` = 1');
    $query->order('`id` DESC');
    return($query);
    }

В зависимости от того заполнено или нет то или иное поле к запросу добавляется определенное условие. Запрос срабатывает (не совсем конечно красивый код да и кавычки не везде экранированы, но это лишь прототип) и выдает нужный результат. Однако в результате есть строка "курорт". В БД есть 2 таблицы - таблица с турами (турфирма) и таблица с курортами. Когда администратор заполняет тур в админке он присваивает ему тот или иной курорт.

Собственно вопрос: как, зная ид записи в таблице с курортами, вытянуть название (поле title) курорта ? Курорты находятся в другой таблице, не связанной по сути с таблицей туров.  В составных запросах я не силен + у меня возник вопрос -  можно ли это возложить на работу контроллера или же подобные вещи нужно делать только в модели и писать составной запрос в БД ?
В общем натолкните на путь истинный и помогите с составным запросом. Учитывая "монстра" который есть сейчас не могу смекнуть как дописать в него условие и что делать если нужно будет не с 1 а с 2 или трех разных таблиц выбрать данные

Заранее прошу прощения если вопрос покажется кому - либо сильно глупым.

*

voron121

  • ****
  • 222
  • + 1 -
  • Метод тыка и мата помогает в кодинге
чуть изменил условие

Код: php
$db = JFactory::getDbo();
  $query = $db->getQuery(true);
  $query->select(array('a.*' , 'b.title' , 'b.id'));
  $query->from('`#__tour` AS a');
  $query->join('RIGHT', '#__tourcountry AS b ON (a.strana_tour = b.id)');
 
  if ($formdata['strana_tour'] != NULL) {
  $query->where('`strana_tour` = '. $db->quote($formdata['strana_tour']));
  }

  if ($formdata['strana_ot'] != NULL) {
  $query->where('`strana_ot` = '. $db->quote($formdata['strana_ot']));
  }
 
  if ($formdata['start_date'] != NULL and empty($formdata['end_date'])) {
  $query->where('`start_date` >= '. $db->quote($formdata['start_date']));
  }
 
  if ($formdata['end_date'] != NULL and empty($formdata['start_date'])) {
  $query->where('`end_date` >= '. $db->quote($formdata['end_date']));
  }

  if ($formdata['start_date'] != NULL and $formdata['end_date'] != NULL) {
  $query->where('`start_date` >= '. $db->quote($formdata['start_date']));
  $query->where('`end_date` <= '. $db->quote($formdata['end_date']));
  }

  if ($formdata['vzroslie'] != NULL and empty($formdata['deti'])) {
  $query->where('`vzroslie` >= '. $db->quote($formdata['vzroslie']));
  }
 
  if ($formdata['deti'] != NULL and empty($formdata['vzroslie'])) {
  $query->where('`deti` >= '. $db->quote($formdata['deti']));
  }

  if ($formdata['vzroslie'] != NULL and $formdata['deti'] != NULL) {
  $query->where('`vzroslie` >= '. $db->quote($formdata['vzroslie']));
  $query->where('`deti` >= '. $db->quote($formdata['deti']));
  }

  if ($formdata['night_start'] != NULL and empty($formdata['night_end'])) {
  $query->where('`night` >= '. $formdata['night_start']);
  }
 
  if ($formdata['night_end'] != NULL and empty($formdata['night_start'])) {
  $query->where('`night` >= '. $formdata['night_end']);
  }

  if ($formdata['night_start'] != NULL and $formdata['night_end'] != NULL) {
  $query->where('`night` >= '. $formdata['night_start']);
  $query->where('`night` <= '. $formdata['night_end']);
  }

  if (!empty($formdata['sp_inp']) and empty($formdata['ep_inp'])) {
  $query->where( $price . ' >= ' . $formdata['sp_inp']);
  }

   if (empty($formdata['sp_inp']) and !empty($formdata['ep_inp'])) {
  $query->where( $price . ' <= ' . $formdata['ep_inp']);
  }

  if ($formdata['sp_inp'] != NULL and $formdata['ep_inp'] != NULL) {
  $query->where( $price . ' >= ' . $formdata['sp_inp']);
  $query->where( $price . ' <= ' . $formdata['ep_inp']);
  }

  if ($formdata['eat'] != NULL) {
  $query->where( 'eat  IN ( ' .  "'" . implode("', '",  $formdata['eat']). "'" .' )');
  }

  if ($formdata['star'] != NULL) {
  $query->where( 'star  IN ( ' .  "'" . implode("', '",  $formdata['star']). "'" .' )');
  }

  if ($formdata['resort'] != NULL) {
  $query->where( 'resort  IN ( ' .  "'" . implode("', '",  $formdata['resort']). "'" .' )');
  }

  if ($formdata['hotels'] != NULL) {
  $query->where( 'otel  IN ( ' .  "'" . implode("', '",  $formdata['hotels']). "'" .' )');
  }

  if (JLanguageMultilang::isEnabled()) {
  $query->where('a.language in (' . $db->quote(JFactory::getLanguage()->getTag()). ',' . $db->quote('*'). ')');
  }  

  $query->where('`published` = 1');
  $query->order('`a.id` DESC');
  return($query);

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

 как мне вывести данные в цикле если у меня есть ячейка title и в турах и в курортах ? <?=$item->title?> выводит только название курорта но мне нужно так же вывести и название тура
« Последнее редактирование: 17.07.2016, 09:19:05 от voron121 »

*

voron121

  • ****
  • 222
  • + 1 -
  • Метод тыка и мата помогает в кодинге
Можно закрывать тему. Все оказалось весьма прозаично и просто. К сожалению в тех мануалах, которые мне попались под руку не было ни слова про переопределение полей. В итоге код преобрел вот такой вид

Код: php
             $db = JFactory::getDbo();
    $query = $db->getQuery(true);
    $query->select(array('a.*' , 'b.title AS resort_title' , 'b.id'  , 'c.title AS hotel_title' , 'c.id'));
    $query->from('`#__tour` AS a');

    $query->join('INNER', '#__resort AS b ON (a.resort = b.id)');
....

и за счкет переопределения поля  'b.title AS resort_title'   во вьюхе я могу вывести <?=hotel_title?> или же другое значение которое мне нужно если оно будет в выборке  yes!