Categoria: database

CakePHP: caching semi automatico delle query tramite AppModel

23 gennaio 2012Categoria:database | php

In un precedente articolo è stata mostrata una semplice struttura per salvare i dati in cache da controller.
Per automatizzare questa funzionalità e scrivere meno codice è possibile centralizzare le funzioni necessarie all’interno della classe AppModel.

La classe contiene:

  • una variabile $cache_key per impostare la chiave per il salvataggio in cache
  • una funzione findCached() da richiamare con gli stessi parametri della funzione find() standard che ritorna i risultati salvati in cache oppure, nel caso in cui non ci siano risultati salvati, esegue la funzione find()
  • il callback afterFind() per salvare i risultati in cache dopo la prima esecuzione della query

Ed ecco la classe completa con i commenti necessari per comprenderne il funzionamento:

Leggi tutto…

CakePHP Paginator: ordinamento in base a un campo Translated

6 dicembre 2011Categoria:database | php

Nel caso in cui si utilizzi il Paginator Helper e si vogliano ordinare i risultati in base ad un campo tradotto con Tranlsate Behavior

var $actsAs = array(
    'Translate'=> array(
        'name'
    )
);

si deve utilizzare all’interno delle view la funzione sort in questo modo

echo $paginator->sort('name','I18n__name.content');

e aggiungere  nell’AppModel la seguente funzione (testato in CakePHP 1.3):

function hasField($fieldName) {
    if (parent::hasField($fieldName))
        return true;
    else
        switch ($fieldName) {
            case "content":
                return true;
            default:
                return false;
        }
    return false;
}

PostgreSQL: eseguire ricerche su colonne di tipo array

20 luglio 2011Categoria:database

PostgreSQL permette di creare delle colonne come array di tipi di dati base. Praticamente è possibile inserire array di numeri integer o real,  testi, timestamp, boolean, ecc…
Ovviamente PostgreSQL mette a disposizione anche una serie di operatori ad hoc per la ricerca sugli array.

Oltre ai classici operatori di comparazione (uguale, maggiore, minore, …) ce ne sono 3 che possono essere molto utili: containsis contained by, overlap.

Prima di iniziare a vedere come funzionano creiamo una tabella di test molto semplice (una colonna con id autoincrementale ed una colonna di tipo array di smallint) e inseriamo alcuni dati:

Leggi tutto…

CakePHP: modificare dinamicamente i parametri di connessione al database

23 aprile 2011Categoria:database | php

In CakePHP i parametri per la connessione al database vengono impostati all’interno della classe DATABASE_CONFIG (file: app/config/database.php).
Per modificare i paramentri dinamicamente è possibile utilizzare la classe ConnectionManager.

Supponendo di dover modificare il prefisso delle tabelle ad esempio:

App::Import('ConnectionManager');
$ds = ConnectionManager::getDataSource('data_source_da_modificare');
$ds->config['prefix'] = $nuovo_prefisso;

Nel caso in cui si voglia creare un nuovo datasource invece di sovrascriverne uno esistente si deve utilizzare il metodo create() del ConnectionManager:

App::Import('ConnectionManager');
$ds = ConnectionManager::getDataSource('data_source_da_modificare');
$new_ds = $ds->config;
$new_ds['prefix'] = $nuovo_prefisso;
ConnectionManager::create('nome_nuovo_datasource', $new_ds);

Postgres query: join tra tabelle di schemi diversi

9 aprile 2011Categoria:database

Per eseguire una JOIN tra due tabelle inserite in schemi diversi, come nell’esempio seguente:

SCHEMA "dati"
tabella: comments
	- comment_id
	- comment
	- user_id

SCHEMA "gestione"
tabella: users
	- user_id
	- username

è sufficiente aggiungere il nome dello schema prima del selettore in questo modo:

SELECT *
FROM “dati”.”comments” AS “Comment”
LEFT JOIN “gestione”.”users” AS “User” ON (“Comment”.”user_id” = “User”.”user_id”)
WHERE 1 = 1 LIMIT 1

Conversione degli array da Postgres a PHP e viceversa

5 aprile 2011Categoria:database | php

PostgreSQL permette di salvare i dati come array ( http://www.postgresql.org/docs/current/static/arrays.html ). La forma per il salvataggio di un array è la seguente:


{3,56,78,9,72}

Per poter gestire i risultati in PHP occorre eseguire una conversione. Per ogni campo della tabella contenente un array monodimensionale è possibile utilizzare la funzione str_getcsv() .
Al momento del salvataggio per eseguire l’operazione inversa, cioè la conversione da PHP a Postgres si può utilizzare la funzione implode (sempre nel caso di array monodimensionale).

Ecco come utilizzarle:
Leggi tutto…