fare una query SELECT

23 contenuti / 0 new
Ultimo contenuto
fare una query SELECT

Ciao a tutti.
Sto cercando documentazione per capire come fare una SELECT semplicissima.
Oltre che come, cioè se prima devo creare la connessione ecc..., vorrei sapere anche dove posso scrivere questa query.
Per esempio se mi faccio una pagina.tpl.php posso fare i test li dentro per poi crearmi un modulo?

grazie mille per i consigli!

i link che stò leggendo sono questi, però poco ci quaglio :(

db_query
lullabot
drupal.org

Quote:
Per esempio se mi faccio una pagina.tpl.php posso fare i test li dentro per poi crearmi un modulo?
si

ok perfetto... mi potresti fare un esempio di una SELECT semplicissima con relativo recupero e stampa del risultato?

grazie mille!!!!!!!

eheheh... ci riproverò ma la documentazione sul sito ufficiale non riesco proprio a farmela andare giù.... non sò perchè ma non la capisco molto... tutto quello che ho imparato su drupal viene da altre fonti...

Rieccomi qua stremato :)
Ho capito come creare un modulo e come lanciare una query e recuperare il contenuto inserendolo nel blocco.
Così come posso fare e lanciare la query all'interno di una funzione in template.php e lanciarla da un file.tpl.php.

La query su una tabella l'ho capita ed è quanto segue:

$query = db_select('node', 'n')
->fields('n', array('nid', 'title'))
->condition('type', 'mioContenuto')
->condition('status', 1) //Published.
->orderBy('created', 'DESC'); //Most recent first.
  $result = $query->execute();
  while($row = $result->fetchAssoc()) {
  echo '<h3>'.$row['title'].'</h3>';
  }

Ora però vorrei recuperare il contenuto legato a quel nodo... ovvero il testo e la relativa thumbnail.
Penso vada fatta una left join, ma guardando qui poco sono riuscito a capire...
Mi potreste illuminare?

grazieeee!!!

Per le query devi studiarti sql c'è poco da fare

somtam wrote:
Rieccomi qua stremato :)
Ho capito come creare un modulo e come lanciare una query e recuperare il contenuto inserendolo nel blocco.
Così come posso fare e lanciare la query all'interno di una funzione in template.php e lanciarla da un file.tpl.php.

[CUT...]

Ora però vorrei recuperare il contenuto legato a quel nodo... ovvero il testo e la relativa thumbnail.
Penso vada fatta una left join, ma guardando qui poco sono riuscito a capire...
Mi potreste illuminare?

grazieeee!!!

Se non ho capito male la tua esigenza: stai facendo a mano quello che il modulo views ti permette di fare tramite interfaccia grafica.

x Robertom: mmm... praticamente si. Solo che penso mi porti ad avere un controllo maggiore sul output.

x Ealmuno: premetto che sono riconoscente per ogni lettera che digitate per rispondere alle mie domande. Però mi sento di esprimere il disaccordo con questo tipo di risposte. Cioè non sto chiedendo "come si fa un sito in Drupal?". Sto facendo delle domande più dettagliate, da niubbo certo, ma che cadono nel dettaglio, così come le risposte che scrivo quando trovo la soluzione. In questa maniera quando un altro utente farà un cerca su un post che si intitola "fare una query select" avrà una case history dettagliata. Ora, per capire come fare una select, seguendo le tue indicazioni, mi sono dovuto fare la parte relativa ai moduli (cosa che mi interessava certo), mentre le select a un db in drupal non per forza comporta questo. Ora che cerco di capire come fare una join in un database drupal mi dici che cè poco da fare se non studio sql... bè per fare l'albero ci vuol il legno, per fare il legno ci vuole l'albero e così via... ribadisco non voglio fare polemica (e ti ringrazio ancora per le volte che mi hai risposto) ma vorrei solo esprimere la mia opinione sulla qualità che un post del genere produce.

somtam wrote:
x Robertom: mmm... praticamente si. Solo che penso mi porti ad avere un controllo maggiore sul output.

Beh... questa è un'affermazione forte eh! ;)

A parte gli scherzi: views è un "compositore" di query. Che poi abbia anche la possibilità di fare un po di "tematizzazione" è un più...

comunque, a meno di cose "particolarissime", la possibilità di fare il rewrite per singolo field e la possibilità di avere un .tpl.php per la singola views o il singolo display, ti dovrebbe dare tutto il necessario. Il resto è soltanto css.

Male che vada attivi la modalità debug, crei la query che ti interessa, e la copi all'interno del tuo modulo per tematizzare il risultato come meglio credi.

Ancora non li ho visti, ma ho questi due link nei preferiti da ormai un po' di tempo:

Taming the Beast: Learn Views with NodeOne
Learn Page manager!

Il problema di views è che fa una marea di query inutili, io potrei anche dirti come fare la query solo che come dici te la soluzione c'è già e basta cercare query sql join, altrimenti dovresti darmi tutte le informazioni e dovrei fartela io.

ealmuno wrote:
Il problema di views è che fa una marea di query inutili

Ad esempio...?

Hai già segnalato il problema sull'issue queue di views?

Essendo un modulo pensato per fare le query fa il suo lavoro ma se guardi quello che fa ti accorgi che la query non è per nulla ottimizzata, purtroppo è un difetto e non ci sono soluzioni per adesso, se non fare i singoli casi uno per uno, cosa impossbile.

Ciao e grazie per le risposte! Sono vicino a vedere la luce!! ho dei risultati tangibili, ma ancora delle perplessità.
Per quanto riguarda le View mi sembrava che girasse troppa roba per magari una SELECT semplicissima, quindi sapere mettere le mani, non dico in inserimento dati che mi sa che è un delirio, ma almeno in recupero, mi sembrava doveroso per aumentare la sensazione di controllo su Drupal.
Detto questo ecco la query funzionante a cui sono arrivato.

$sql = "
SELECT nid, title, field_testo_value AS testo
FROM {node}
LEFT JOIN  {field_data_field_testo} ON nid = entity_id
WHERE type='mioContenuto' AND status=1
ORDER BY created DESC";
$result = db_query($sql);
foreach ($result as $record) {
  echo $record->testo;
}

1) Ho visto che le tabelle devono avere le graffe... penso sia dovuto al fatto che Drupal aggiunge qualcosa ma non so' bene.
2) Guardano il database devo dedurre che ogni campo (testo, immagine, valoreBoleano) ha una tabella personale. Ma per quanto riguarda il recupero del nome di un'immagine e il suo percorso, io mi ritrovo ad avere la tabella "field_data_field_image" con il campo "field_image_fid" a valore numerico, di cui appunto non riesco a capire l'utilizzo.
3) Altra cosa non sto usando il db_select e la sua sintassi perchè non ho capito come fare per legare il join, la cui documentazione mi da questa sintassi:
$table_alias = $query->join('user', 'u', 'n.uid = u.uid AND u.uid = :uid', array(':uid' => 5));

grazie mille!

@emlauno: non per smentirti, ma views va esattamente le query chi gli dici di fare, nulla di più nulla di meno :) Se vuoi ottimizzarle puoi in ogni caso intervenire successivamente (sempre che ci sia realmente il bisogno di farlo).

@somtam: per scrivere codice di test ti consiglio di NON abituarti a farlo in template, la tentazione successiva di lasciarlo li è forte :D Puoi scaricarti il modulo devel che una volta abilitato ti consente di fare test scrivendo codice direttamente nella pagina devel/php.

Concordo comunque con @robertom nel NON reinventare la ruota quando non serve. Se invece la tua esigenza è a puro scopo di studio, Drupal è cambiato il modo di scrivere le query con Druapl 7 passando ad una struttura basata su PDO. In pratica la tua query non viene scritta da te direttamente, ma costruita da PDO in base ad una serie di parametri che gli passi. Sicuramente la struttura un pò si complica, ma nulla che non possa essere risolto :P

Come indicata emlauno serve comunque una conoscenza minima di SQL per determinare la struttura della query, che poi dovrai trasformare negli oggetti Drupal.

Segnalo infine, che in determinati contesti, più che scrivere la query puoi provare ad usare le API per estrarre le entità che ti servono (node_load & c), in modo da far caricare l'oggetto completo al sistema, senza doverti occupare delle variazioni della consistenza dello stesso. NB: questa soluzione a usate se ti serve l'oggetto, NON SEMPRE!

Ciao
Marco
--
My blog
Working at @agavee

ciao mavimo, grazie della risposta, però non capisco proprio cosa mi stai consigliando per potere procedere con lo studio che sto facendo.

mavimo wrote:

Concordo comunque con @robertom nel NON reinventare la ruota quando non serve. Se invece la tua esigenza è a puro scopo di studio, Drupal è cambiato il modo di scrivere le query con Druapl 7 passando ad una struttura basata su PDO. In pratica la tua query non viene scritta da te direttamente, ma costruita da PDO in base ad una serie di parametri che gli passi. Sicuramente la struttura un pò si complica, ma nulla che non possa essere risolto :P

... e ma infatti penso sia quello che sto cercando di fare.
Come dicevo nei vari interventi del post, prima sono arrivato a fare una select normale con le funzioni di drupal

$query = db_select('node', 'n')
->fields('n', array('nid', 'title'))
->condition('type', 'mioContenuto')
->condition('status', 1) //Published.
->orderBy('created', 'DESC'); //Most recent first.
  $result = $query->execute();
  while($row = $result->fetchAssoc()) {
  echo '<h3>'.$row['title'].'</h3>';
  }

... poi sono passato a fare "con una query tradizionale" un LEFT JOIN per testare che funzionasse

$sql = "
SELECT nid, title, field_testo_value AS testo
FROM {node}
LEFT JOIN  {field_data_field_testo} ON nid = entity_id
WHERE type='mioContenuto' AND status=1
ORDER BY created DESC";
$result = db_query($sql);
foreach ($result as $record) {
  echo $record->testo;
}

.... e ora sto chiedendo una mano per potere scrivere la query che ho appena scritto facendola con la sintassi db_select ecc... ( che è quella scritta appunto nel manuale di drupal 7 su drupal.org). Stò inoltre chiedendo, per una campo immagine, come posso recuperare e stampare l'immagine (o la relativa thumbnail).

grazie

@somtam: la join la puoi ottenere usando il metodo join dell'oggetto SelectQuery. In questi casi la cosa migliore è cercare sul sito http://api.drupal.org

Per la stampa dell'immagine, invece, il metodo giusto sarebbe quello di identificare, tramite la query, il fid dell'oggetto che vuoi usare, dopo di che usare le File API (vedi esempio) per caricare l'oggetto e passare il dato poi alla funzione di theming per le immagini.

Il mio consiglio PERO' è di provare e imparare ad usare gli strumenti già esistenti PRIMA di iniziare a ravanare così "in basso" nel sistema.

Ciao
Marco
--
My blog
Working at @agavee

Ciao Mavimo,
grazie per l'aiuto. Se intendi che dovrei usare le view allora, come dicevo prima, l'ho gia fatto, ma vorrei capirci di più riuscendo a risolvere questo studio che sto facendo, ovvero un semplice recupero e stampa di titolo, testo, immagine...
Per quanto riguarda la query, la sintassi l'avevo vista e postata:
$table_alias = $query->join('user', 'u', 'n.uid = u.uid AND u.uid = :uid', array(':uid' => 5));
Non capisco a che punto della query (vedi sotto) la devo mettere

$query = db_select('node', 'n')
->fields('n', array('nid', 'title'))
->condition('type', 'mioContenuto')
->condition('status', 1) //Published.
->orderBy('created', 'DESC'); //Most recent first.
  $result = $query->execute();
  while($row = $result->fetchAssoc()) {
  echo '<h3>'.$row['title'].'</h3>';
  }

non è che mi fai vedere come si fa usando questo join? LEFT JOIN {field_data_field_testo} ON nid = entity_id

grazie mille!

Ci siamo quasi!!!! e scusate se vi sto tediando, ma non posso mollare ora!!!
Anche se con la query, per ora, scritta nella maniera tradizionale, direi che abbiamo quasi recuperato il tutto.
Manca solo come recuperare la thumb e non l'immagine grossa.

Ecco il codice:

$query = "
SELECT nid, title, field_image_fid AS img, field_testo_value AS testo
FROM node
LEFT JOIN  field_data_field_testo ON nid = field_data_field_testo.entity_id
LEFT JOIN  field_data_field_image ON nid = field_data_field_image.entity_id
WHERE type='mioContenuto' AND status=1
ORDER BY created DESC";
$result = db_query($query);
foreach ($result as $record) {
$immagine = $record->img;
$imgpath = file_load($immagine)->uri;
$immagine=file_create_url($imgpath);
echo '<img src="'.$immagine.'" /><br>';
}

grazie mille ancora!

FINITO!!!!!
Che fatica però sapere
A) se esistono delle funzioni che fanno al caso tuo...
B) trovarle...
Comunque ecco il risultato:

$query = "
SELECT nid, title, field_image_fid AS fid, field_testo_value AS testo
FROM node
LEFT JOIN  field_data_field_testo ON nid = field_data_field_testo.entity_id
LEFT JOIN  field_data_field_image ON nid = field_data_field_image.entity_id
WHERE type='mioContenuto' AND status=1
ORDER BY created DESC";
$result = db_query($query);
foreach ($result as $record) {
$title = $record->title;
$testo = $record->testo;
$img = $record->fid;
$imgpath = file_load($img)->uri;
$immagine=file_create_url($imgpath); // path dell'immagine
$ant = image_style_url('thumbnail', $imgpath); // path dell'anteprima
}

@somtam: Personalmente credo che la tua query debba essere riscritta, usa db_select() e poi metti oin & c, usare db_query() è veramente grzzo e poco portabile. La tua quesry, una volta identificata, non è nulla di particolarmente cmplesso da replicare usando il DB layer nella maniera opportuna.

Ciao
Marco
--
My blog
Working at @agavee

Ciao Mavimo,
ci ho provato a rendere la query con query_db, ma non riesco a capire come fare le join :(
lo so sarà una cavolata, ma non è che io sia un programmatore puro!

grazie!

Vado a memoria, quindi abbi pieta di me :)

<?php
$query
= db_select('node', 'n');
$query->fields('n', array('nid', 'title'));
$query->join('field_data_field_testo', 't', 't.entity_id = n.nid');
$query->addField('t.field_testo_value', 'file');
$query->join('field_data_field_image', 'i', 'i.entity_id = n.nid');
$query->addField('i.field_image_fid', 'fid');
$query->condition('n.type', 'mioContenuto' , '=');
$query->condition('n.status', 1 , '=');
$query->orderBy('n.created');
$query->execute();
?>

Ciao
Marco
--
My blog
Working at @agavee