24 apr 2008

Come creare una query sql in CakePHP



Capita spesso di dover estrarre dati da un database (nel mio caso MySQL) per poterli in qualche modo visualizzare. CakePHP mette a disposizione delle funzioni molto utili a questo scopo, che andremo a vedere ora in dettaglio.

Supponiamo di aver definito un Model di nome User (e quindi la relativa tabella MySQL, secondo le convenzioni di CakePHP, si chiamerà Users). All’interno del model user.php andiamo a creare la seguente funzione:

function getDbUser()
{
$ret = $this->query("SELECT surname FROM users WHERE id = 1");
$name = $ret[0]['users']['surname'];
return $name;
}

Vediamo nello specifico che cosa fa:

  1. effettua la seguente query: SELECT surname FROM users WHERE id = 1
  2. salva il cognome, ottenuto dalla query appena vista nell’array $ret, nella variabile $name
  3. restituisce la variabile $name

Per capire meglio cosa fa la riga $ret[0][‘users’][‘surname’], è utile analizzare il contenuto dell’array $ret (per farsi stampare l’array possiamo usare la funzione $this->log($ret);):

(
    [0] -> Array
        (
            [users] -> Array
                (
                    [surname] -> pallino
                )
 
        )
 
)

Il numero 0 sta a significare che l’array contiene un solo elemento, che è a sua volta un array di nome users (il nome della tabella del database) che a sua volta contiene il campo surname a cui è associato il valore che stiamo cercando. Appare quindi evidente che $ret[0][‘users’][‘surname’] non fa altro che restituire il surname, ovvero “pallino”.

Infine per eseguire la query in un controller, tipicamente in users_controller.php, basterà chiamarla con questa sintassi:

$surname= $this->User->getDbUser();

dove User è il nome del model e getDbUser() quella della funzione che abbiamo definito al suo interno.


Tags: , , , ,

Subscribe to Comments

5 Responses to “Come creare una query sql in CakePHP”

  1. C’e’ un pluginwordpress che si chiama “code syntax” o qualcosa del genere che ti permette di inserire codice in WP (Json, javascript, php, …) e te lo formatta bene in automatico.
    daCCi occhio se ti va

     

    paolo

  2. SCritto veloce nel nostro wiki interno e copiato qui.

    Cakephp, come rails, ha tutta una serie di convenzioni sui nomi delle tabelle.
    A cosa servono queste convenzioni?
    Tra l’altro a darti tutta una serie di funzioni in automatico senza dover scrivertele (e tra l’altro che continuano a funzionare anche se cambi il model …)
    La bottomline e’ che non serve scriversi SQL per le funzioni tipiche (quasi tutte).

    Esempi?
    Ne trovi a
    http://manual.cakephp.org/view/72/model-methods

    findBy
    These magic functions can be used as a shortcut to search your tables by a certain field. Just add the name of the field (in CamelCase format) to the end of these functions, and supply the criteria for that field as the first parameter.
    PHP5 findAllBy Example Corresponding SQL Fragment
    $this->Product->findAllByOrderStatus(‘3’); Product.order_status = 3
    $this->Recipe->findAllByType(‘Cookie’); Recipe.type = ‘Cookie’
    $this->User->findAllByLastName(‘Anderson’); User.last_name = ‘Anderson’

    findAll
    1. findAll(string $conditions, array $fields, string $order, int $limit, int $page, int $recursive);
    Returns the specified fields up to $limit records matching $conditions (if any), start listing from page $page (default is page 1). If there are no matching fields, an empty array is returned.
    The $conditions should be formed just as they would in an SQL statement: $conditions = “Pastry.type LIKE ‘%cake%’ AND Pastry.created_on > ‘2007-01-01’”, for example. Prefixing conditions with the model’s name (‘Pastry.type’ rather than just ‘type’) is always a good practice, especially when associated data is being fetched in a query.

    Ecc…

    Da notare inoltre un’altra cosa.
    In Rails, la findAll torna una lista lunga e si puo’ passarne una parte (diciamo i primi 10) alla view e poi settare nella view una qualche opzione “paginate”.
    In automatico la view ti mette i link a “pagina 2”, “pagina 3”, … e in automatico si cacha la risposta (ovvero non fa di nuovo la query quando gli chiedi, via link, fammi vedere i post dall’11 al 20, ad esempio).
    Sicuramente c’e’ qualcosa di simile in CakePhp ma non ho guardato.

    Inoltre ha senso interallacciare questa “paginazione e caching” con extjs.
    Si puo’ fare? Tutto si puo’ fare, basta solo cercare in google e poi dedicarci alcuni minuti per capire (cosa che io non ho fatto) 😉
    Links:
    http://www.ntatd.org/mark/?p=29
    http://www.ntatd.org/mark/?p=30
    http://www.ntatd.org/mark/?p=32
    http://djz.hu/blog/posts/696
    (tutti del.icio.usati con “sonet” ovviamente!)

     

    paolo

  3. Giusto, non avevo pensato al plugin per la sintassi, ottima idea! 😉
    Al momento ho installato WP-Syntax, reperibile qui:
    http://wordpress.org/extend/plugins/wp-syntax/

     

    MDT

  4. Riguardo le funzioni già esistenti in CakePHP per le queries (come find, findall, findby, ecc.) concordo con te che è più comodo usare quelle quando ci vanno bene.
    Nel caso invece dovessimo fare qualche query più complessa possiamo usare quanto ho scritto sopra (vedi anche http://cakebaker.42dh.com/2007/02/26/should-you-use-modelquery-in-the-controller/ ).

     

    MDT

  5. Forse dovresti aggiornare l’articolo con le ultime “scoperte” fatte da davide!

     

    Marco

Leave a Reply

Message:

  • Ricerca

    or
  • Language

  • Categorie

  • Delicious

  • Statistiche


    Warning: Illegal string offset 'timestamp' in /home/mhd-01/www.micheledallatorre.it/htdocs/blog/wp-content/plugins/firestats/firestats-wordpress.php on line 1081

    Warning: Illegal string offset 'timestamp' in /home/mhd-01/www.micheledallatorre.it/htdocs/blog/wp-content/plugins/firestats/firestats-wordpress.php on line 1081

    Warning: Illegal string offset 'timestamp' in /home/mhd-01/www.micheledallatorre.it/htdocs/blog/wp-content/plugins/firestats/firestats-wordpress.php on line 1081

    Warning: Illegal string offset 'timestamp' in /home/mhd-01/www.micheledallatorre.it/htdocs/blog/wp-content/plugins/firestats/firestats-wordpress.php on line 1081
    • Pages displayed : 33362
    • Unique visitors : 18465
    • Pages displayed in last 24 hours : 0
    • Unique visitors in last 24 hours : 0