Форум русской поддержки Joomla!® CMS
04.12.2016, 03:58:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

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

 (Прочитано 108 раз)
0 Пользователей и 1 Гость смотрят эту тему.
voron121
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« : 17.07.2016, 06:50:37 »

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

Код
 
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
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« Ответ #1 : 17.07.2016, 08:11:37 »

чуть изменил условие

Код
$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, 08:19:05 от voron121 » Записан
voron121
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« Ответ #2 : 17.07.2016, 09:07:56 »

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

Код
             $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!
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet