Joomla.it Forum
Non solo Joomla... => Sviluppo => : grad 15 Jul 2013, 17:30:39
-
Sempre qui a dar noia... ;)
Ho bisogno di fare due query. Ho una vista con 2 tabelle..
Nella prima tabella stampo dei servizi di base che pesco dal db, nella seconda tabella (che sta visivamente sotto la prima) dovrei stampare dei servizi PERSONALI che ha ogni cliente. Nel db sono correttamente inseriti, ma visivamente non so come prenderli... Io stavo usando il solito model (si può?).
Ho dovuto costruire due funzioni getListQuery() ma solo la prima funziona.. nell'altra non mi riempie l'array che poi prendo nella view con il $row-> come mai?
Per chiarezza vi posto il codice intero del mio model.
<?php
defined('_JEXEC') or die();
jimport( 'joomla.application.component.modellist' );
class AnagraficheModelServiziassociatiaggiunt ivi extends JModelList
{
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array('id_tipologia_socio', 'id_servizio', 'nome_servizio', 'cod_persona', 'cod_serv', 'nome_serv');
}
parent::__construct($config);
}
function getListQuery()
{
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id_tipologia_socio, id_servizio, nome_servizio');
$query->from('#__associazione_servizi as serviziassociati, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');
/* Tolta perchè dava più problemi che un libro di matematica
$query->clear();
$query->select('id_persona as cod_persona, id_servizio as cod_serv, nome_servizio as nome_serv')
->from('#__servizi_aggiuntivi as serviziaggiuntivi, #__elenco_servizi')
->where('cod_servizio=id_servizio');
*/
$search = $this->getState('filter.search');
if (!empty($search))
{
$search = $db->Quote('%'.$db->escape($search, true).'%');
$query->where('(serviziassociati.id_tipologia_socio LIKE '.$search.')');
}
$query->order($this->getState('list.ordering', 'id_tipologia_socio').' '.$this->getState('list.direction', 'ASC'));
return $query;
}
function getListQuery2()
{
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id_persona as cod_persona, id_servizio as cod_serv, nome_servizio as nome_serv');
$query->from('#__servizi_aggiuntivi as serviziaggiuntivi, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');
$search = $this->getState('filter.search');
if (!empty($search))
{
$search = $db->Quote('%'.$db->escape($search, true).'%');
$query->where('(serviziaggiuntivi.id_persona LIKE '.$search.')');
}
$query->order($this->getState('list.ordering', 'id_persona').' '.$this->getState('list.direction', 'ASC'));
$row = $db->loadResult();
return $query;
}
protected function populateState($ordering = null, $direction = null)
{
// Load the filter state.
$search = $this->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
$this->setState('filter.search', $search);
// List state information.
parent::populateState($ordering, $direction);
}
}
?>
qualche idea?
-
Usa JOIN
-
ma con la join unisco due tabelle di risultato... mi capita quindi che se come risultato ho 4 servizi generici + 2 servizi aggiuntivi personali i servizi personali mi vengono doppiati... e la cosa non va bene...
mi potresti fare un esempio?
questo sarebbe il mio risultato (allegato) che tra l'altro è errato... perchè dovrebbe essere così poi la mia stampa:
Esempio tipologia VIP (ID=4) e Socio Mario Rossi (ID=1)
Servizi dedicati alla tipologia del socio: PILATES
Servizi aggiuntivi alla persona: ?? ?? dovrebbe essere PISCINA GRANDE ma non possiamo ricavarlo perchè lo so io che ho guardato il db ma da li non si capisce
[allegato eliminato automaticamente dopo un anno]
-
Non si può proprio fare 2 query?
-
sennò stavo pensando... invece che due query, associare due model?
-
sto provando in tutti i modi.... non va... ho provato anche così ma niente:
<?php
defined('_JEXEC') or die();
jimport( 'joomla.application.component.modellist' );
class AnagraficheModelServiziassociatiaggiuntivi extends JModelList
{
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array('id_servizi_aggiuntivi', 'id_persona', 'id_servizio', 'nome_servizio');
}
parent::__construct($config);
}
function getListQuery()
{
/*
SELECT id_servizi_aggiuntivi, id_persona , id_servizio , nome_servizio
FROM joomlatest_servizi_aggiuntivi as serviziaggiuntivi, joomlatest_elenco_servizi
WHERE cod_servizio=id_servizio
*/
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id_servizi_aggiuntivi, id_persona , id_servizio , nome_servizio');
$query->from('#__servizi_aggiuntivi as serviziaggiuntivi, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');
$result1 = $db->loadResult();
$db->setQuery($query);
$query->select('id_tipologia_socio, id_servizio as cod_servizio, nome_servizio');
$query->from('#__associazione_servizi as serviziassociati, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');
$result2 = $db->loadResult();
$search = $this->getState('filter.search');
if (!empty($search))
{
$search = $db->Quote('%'.$db->escape($search, true).'%');
$query->where('(serviziaggiuntivi.id_persona LIKE '.$search.')');
}
$query->order($this->getState('list.ordering', 'id_persona').' '.$this->getState('list.direction', 'ASC'));
$row = $db->loadResult();
return $query;
}
protected function populateState($ordering = null, $direction = null)
{
// Load the filter state.
$search = $this->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
$this->setState('filter.search', $search);
// List state information.
parent::populateState($ordering, $direction);
}
}
?>
-
con la doppia query mi sono arresto.. tanto non va :'(
Allora ho creato un altro model e dal controller principale (controller.php) ho dato alla view serviziassociatiaggiuntivi due Model: il primo si occupa di ricavare dal db tutti i servizi riguardo alla tipologia di cliente, il secondo invece quelli personali.
Il problema è che o funziona uno o funziona l'altro.. non sembrano andare d'accordo...
Posto il mio controller.php
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla controller library
jimport('joomla.application.component.controller');
/**
* General Controller of Anagrafiche component
*/
class AnagraficheController extends JController
{
public function display($cachable = false, $urlparams = false)
{
// set default view if not set
JRequest::setVar('view', JRequest::getCmd('view', 'persone'));
$viewName = JRequest::getCmd('view', $this->default_view);
switch ($viewName)
{
case "serviziassociatiaggiuntivi":
$document = JFactory::getDocument();
$viewType = $document->getType();
$viewLayout = JRequest::getCmd('layout', 'default');
$view = $this->getView($viewName, $viewType, '', array('base_path' => $this->basePath, 'layout' => $viewLayout));
// Get/Create the model
$view->setModel($this->getModel('serviziassociatiaggiuntivi'));
$view->setModel($this->getModel('serviziassociati'),true);
//$view->assignRef('document', $document);
$view->display();
break;
default:
// call parent behavior
parent::display($cachable, $urlparams);
break;
}
}
}
?>
model serviziassociatiaggiuntivi
<?php
defined('_JEXEC') or die();
jimport( 'joomla.application.component.modellist' );
class AnagraficheModelServiziassociatiaggiunt ivi extends JModelList
{
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array('id_servizi_aggiuntivi', 'id_persona', 'id_servizio', 'nome_servizio', 'cod_servizio', 'id_tipologia_socio', 'nome_servizio');
}
parent::__construct($config);
}
function getListQuery()
{
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id_servizi_aggiuntivi, id_persona , id_servizio , nome_servizio');
$query->from('#__servizi_aggiuntivi as serviziaggiuntivi, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');
$search = $this->getState('filter.search');
if (!empty($search))
{
$search = $db->Quote('%'.$db->escape($search, true).'%');
$query->where('(serviziaggiuntivi.id_persona LIKE '.$search.')');
}
$query->order($this->getState('list.ordering', 'id_persona').' '.$this->getState('list.direction', 'ASC'));
return $query;
}
function test()
{
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id_tipologia_socio, id_servizio as cod_servizio, nome_servizio');
$query->from('#__associazione_servizi as serviziassociati, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');
$row = $db->loadObjectList();
return $row;
}
protected function populateState($ordering = null, $direction = null)
{
// Load the filter state.
$search = $this->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
$this->setState('filter.search', $search);
// List state information.
parent::populateState($ordering, $direction);
}
}
?>
model serviziassociati
<?php
defined('_JEXEC') or die();
jimport( 'joomla.application.component.modellist' );
class AnagraficheModelServiziassociatiaggiuntivi extends JModelList
{
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array('id_servizi_aggiuntivi', 'id_persona', 'id_servizio', 'nome_servizio', 'cod_servizio', 'id_tipologia_socio', 'nome_servizio');
}
parent::__construct($config);
}
function getListQuery()
{
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id_servizi_aggiuntivi, id_persona , id_servizio , nome_servizio');
$query->from('#__servizi_aggiuntivi as serviziaggiuntivi, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');
$search = $this->getState('filter.search');
if (!empty($search))
{
$search = $db->Quote('%'.$db->escape($search, true).'%');
$query->where('(serviziaggiuntivi.id_persona LIKE '.$search.')');
}
$query->order($this->getState('list.ordering', 'id_persona').' '.$this->getState('list.direction', 'ASC'));
return $query;
}
function test()
{
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id_tipologia_socio, id_servizio as cod_servizio, nome_servizio');
$query->from('#__associazione_servizi as serviziassociati, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');
$row = $db->loadObjectList();
return $row;
}
protected function populateState($ordering = null, $direction = null)
{
// Load the filter state.
$search = $this->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
$this->setState('filter.search', $search);
// List state information.
parent::populateState($ordering, $direction);
}
}
?>
-
il modo giusto è usare join, il tuo problema sono le query non centra joomla.
Devi strutturare la query in modo che ritorni ciò che vuoi come lo vuoi.
Non possono tornarti valori uguali che si danno fastidio perchè con la join crei per ogni tabella un alias a. b. c. etc per cui non capisco proprio che problema tu possa avere se non di sintassi o logica errata
-
credo sia la mia logica...
allora queste sono le mie tabelle che prendo in considerazione per la mia query (elenco solo le colonne):
------------------------------------------------------------------------
anagrafiche_persone
id | nome | cognome | sesso | telefono_1 | telefono_2 | email | citta | indirizzo | denominazione_socio
tipologia_socio
id | denominazione_socio | descrizione | quota_annua
elenco_servizi
cod_servizio | nome_servizio | descr_servizio | prezzo_servizio
associazione_servizi
id_associazione | id_tipologia_socio | id_servizio
servizi_aggiuntivi
id_servizi_aggiuntivi | id_persona | id_servizio
-------------------------------------------------------------------------------
La mia view cosa deve fare praticamente?
In una view dove ci sono tutti i miei clienti creata ciclando tutta la tabella "anagrafiche_persone", posso clikkare su SERVIZI e mi si apre una nuova view dove ci sono due tabelle.
Nella prima si vedono i servizi offerti di BASE dalla tipologia del socio, nella seconda invece si vedono quelli che il cliente ha richiesto personalmente pagando a parte!
Come potrei strutturare la join?
In allegato:
1. Viiew persone dove ci sono tutti i clienti con il relativo tipo di socio e il link ai servizi
2. view dei servizi associati: i primi quelli base inclusi a seconda della tipologia di appartenenza, i secondi quelli richiesti a parte e quindi PERSONALI.
[allegato eliminato automaticamente dopo un anno]
-
quali sono i valori univoci in comune tra le tabelle?
Cerca un tutorial sulle join di mysql, le tabelle devono essere in relazione tra loro, avere delle foreign key
-
mi ero dimenticato scusami :-\
Allora ecco qui l'sql così si capisce meglio
CREATE TABLE #__tipologia_socio (
id INTEGER AUTO_INCREMENT NOT NULL,
denominazione_socio VARCHAR(255) ,
descrizione VARCHAR(255) ,
quota FLOAT(5,2) ,
CONSTRAINT pk_#__tipologia_socio PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE INDEX denominazione_socio ON #__tipologia_socio(denominazione_socio);
CREATE TABLE #__anagrafiche_persone (
id INTEGER AUTO_INCREMENT not null,
nome VARCHAR(255) ,
cognome VARCHAR(255) ,
sesso VARCHAR(1) ,
telefono_1 VARCHAR(20) ,
telefono_2 VARCHAR(20) ,
email VARCHAR(50) ,
citta VARCHAR(20) ,
indirizzo VARCHAR (50) ,
denominazione_socio VARCHAR (50) ,
Foreign Key (denominazione_socio) references #__tipologia_socio(denominazione_socio) ON UPDATE CASCADE ON DELETE SET NULL,
CONSTRAINT pk_#__anagrafiche_persone PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE #__elenco_servizi (
cod_servizio INTEGER AUTO_INCREMENT not null,
nome_servizio VARCHAR(255) ,
descr_servizio VARCHAR(255) ,
prezzo_servizio FLOAT(5,2) ,
CONSTRAINT pk_#__elenco_servizi PRIMARY KEY (cod_servizio)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE #__associazione_servizi (
id_associazione INTEGER AUTO_INCREMENT NOT NULL,
id_tipologia_socio INTEGER NOT NULL,
id_servizio INTEGER NOT NULL,
Foreign Key (id_tipologia_socio) references #__tipologia_socio(id) ON UPDATE CASCADE ON DELETE CASCADE,
Foreign Key (id_servizio) references #__elenco_servizi(cod_serivizo) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT pk_#__associazione_servizi PRIMARY KEY (id_associazione)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE #__servizi_aggiuntivi (
id_servizi_aggiuntivi INTEGER AUTO_INCREMENT NOT NULL,
id_persona INTEGER NOT NULL,
id_servizio INTEGER NOT NULL,
Foreign Key (id_persona) references #__anagrafiche_persone(id) ON UPDATE CASCADE ON DELETE CASCADE,
Foreign Key (id_servizio) references #__elenco_servizi(cod_serivizo) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT pk_#__servizi_aggiuntivi PRIMARY KEY (id_servizi_aggiuntivi)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
no ma aspetta...
non ho tempo di fare io il lavoro che dovresti fare tu, mi spiace.
Se ti dico che il modo è la join e per fare le join ti serve qualcosa su cui joinare (foreign key) non è che mi posti il codice e io guardo se hai o no le foreign key... puoi benissimo controllare tu, se non sai qualcosa cerchi con google studi ciò che è lacunoso e torni coi nuovi problemi.
Così costringi le persone a farti i lavori e alla fine non ti risponde più nessuno ... imho
-
nono.. aspetta, ci siamo fraintesi...
Io non ho chiesto di fare del lavoro per me!
Ho postato il codice per farti capire che secondo me la JOIN non funziona! Le foreign key ce l'ho e le ho messe e funzionano come vedi da codice...
Praticamente io devo ritornare due tabelle tipo
servizi_associati
id_tipologia_socio | id_servizio.associati | nome_servizio.associato
servizi_aggiuntivi
id_persona | id_servizio.aggiuntivi | nome_servizio.aggiuntivo
Con la JOIN a naso non mi sembra fattibile... attacca due tabelle che hanno qualcosa in comune! A me servono due select DISTINTE. A quel punto in teoria dovrebbero esserci tutti i valori ritornati dentro l'array e li potrei usare nella mia view tramite $row->valore;
Spero di essere stato chiaro. Non fraintendiamoci, non voglio abusare di nessuno. Il problema mio credo sia nella logica, non nel non avere voglia e tempo di lavorarci. Ci sono dietro da 1 settimana!
PS: piccola idea dopo il mio sfogo... potrei inserire nella mia tabella servizi_aggiuntivi una colonna id_tipologia_socio così poi nella join faccio una cosa tipo servizi_aggiuntivi.id_tipologia_socio = servizi_associati.id_tipologia_socio. Dovrebbe funzionare, tanto una persona può avere SOLO una tipologia di socio ed essendo una foreign key appartenente alla tabella tipologie_socio nel caso di modifica, cancellazione si fa il cascade e si aggiorna ecc ecc...
-
servizi_associati
id_tipologia_socio | id_servizio.associati | nome_servizio.associato
servizi_aggiuntivi
id_persona | id_servizio.aggiuntivi | nome_servizio.aggiuntivo
Le foreign key ce l'ho e le ho messe e funzionano
-----------------------------------------------------------------
quali sono in queste due tabelle i campi in relazione?
-
ecco.. quali sono i campi in relazione tra le due tabelle?!? NON ce ne sono!
Era questo il mio problema per la JOIN !!!! adesso praticamente che ho fatto ho fatto così:
servizi_associati[/size]id_tipologia_socio | id_servizio.associati | nome_servizio.associatoservizi_aggiunti viid_persona | id_servizio.aggiuntivi | nome_servizio.aggiuntivo | id_tipologia_socio
praticamente ho aggiunto il campo id_tipologia_socio che è in relazione a servizi_associati. Entrambe sono foreign key della tabella tipologia_socio.
Adesso provo a vedere se funziona! Tanto un utente può avere un solo tipo di socio quindi dovrebbe funzionare.
-
Il problema l'ho risolto ;) ovviamente non si poteva risolvere con una join perchè per come era strutturato il database e per alcune esigenze la soluzione consisteva di usare una UNION.