Tag: 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;
}

CakePHP: paginazione con condizioni su campi tradotti

30 novembre 2011Categoria:php

Per eseguire la paginazione in CakePHP utilizzando delle condizioni sui campi tradotti (Translate Behavior) è necessario aggiungere alcune funzioni nell’app_model (testato nella versione 1.3):

var $usePaginateMethod = 'standard';
function setPaginate($method=''){
    if (empty($method)){
        $this->usePaginateMethod = 'standard';
    }else{
        $this->usePaginateMethod = $method;
    }
}

function paginateCount($conditions, $recursive, $extra){
    switch ($this->usePaginateMethod) {
        case 'standard':
            return $this->standardPaginateCount($conditions, $recursive, $extra);
        break;

        case 'custom':
        return $this->customPaginateCount($conditions, $recursive, $extra);
        break;
    }
}

function standardPaginateCount($conditions, $recursive, $extra){
    $results = $this->find('count', compact('conditions', 'recursive', 'extra'));
    return $results;
}

function customPaginateCount($conditions, $recursive, $extra){
    $results = $this->find('all', compact('conditions', 'recursive', 'extra'));
    $count = count($results);
    return $count;
}

Leggi tutto…

CakePHP: una semplice struttura per salvare i dati in cache via controller

8 settembre 2011Categoria:php

Ecco una struttura molto semplice per gestire via controller i dati da salvare in cache:

//imposta identificativo dei dati salvati in cache
$cache_id = 'contenuto_xyz';
//imposta un prefisso per la cache costituito da LINGUA_mycache_
Cache::set(array('prefix' => Configure::read('Config.language').'_mycache_'));
//cerca i dati. se la chiave della cache non è impostata, se è scaduta
//o si verifica un errore durante la lettura $data sarà == false
$this->data[$cache_id] = Cache::read($cache_id);
//se i dati non sono in cache
if ($this->data[$cache_id] === false) {

    /*   INIZIO RICERCA/ELABORAZIONE DATI  */
    $data = $this->XYZ->find('all');
    /*  FINE RICERCA/ELABORAZIONE DATI  */

    //scrittura dell'elemento in cache
    Cache::set(array('prefix'=>Configure::read('Config.language').'_mycache_'));
    Cache::write($cache_id, $data );
}
//imposta la variabile con i dati
$this->data[$cache_id] = $data;

Leggi tutto…

CakePHP: eseguire ricerche sui campi tradotti (Translate Behavior)

6 settembre 2011Categoria:php

CakePHP permette di gestire la traduzione dei campi del DB tramite Translate Behavior.
Ad esempio se abbiamo un Model chiamato Elements definito nel seguente modo:

class Element extends AppModel {

}

Possiamo impostare che i campi title e description siano trattati come traduzioni:

Leggi tutto…

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: creazione di un modello on the fly

27 giugno 2011Categoria:php

Durante lo sviluppo di un’applicazione con CakePHP può essere necessaria la creazione di un modello “al volo” non definito a priori come classe.

Ecco come fare con poche righe di codice:

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

PHP Object Generator – crea il codice object oriented per gestire il database

23 dicembre 2009Categoria:php

PHP Object Generator è un servizio che permette di creare automaticamente il codice PHP orientato agli oggetti per gestire un database. Dalla pagina principale del servizio è sufficiente inserire i campi utilizzati nella tabella mySQL e il nome della classe che gestirà le operazioni.

Leggi tutto…