FuelPHP - Modelli e database
Il modello gioca un ruolo importante nel framework web FuelPHP. Rappresenta le entità aziendali dell'applicazione. Sono forniti dai clienti o recuperati dal database back-end, manipolati secondo le regole aziendali e persistenti nel database. Impariamo a conoscere i modelli e come interagiscono con il sistema di back-end in questo capitolo.
Creazione di un modello
In FuelPHP, il modello è semplicemente una semplice classe PHP che estende la classe Model incorporata. Per impostazione predefinita, i modelli possono avere il prefisso Model_ simile ai controller e devono essere inseriti infuel/app/classes/model/cartella. Creiamo un modello di base dei dipendenti e lo estendiamo man mano che procediamo.
carburante / app / classi / modello / dipendente.php
<?php
namespace Model;
class Model_Employee extends \Model {
public static function fetchAll() {
// Code to fetch employee from database
}
}
Accedi a un modello
Una volta definito un modello, può essere utilizzato liberamente in qualsiasi controller semplicemente includendolo nel controller come segue.
use \Model\Employee;
class Controller_Employee extends Controller {
public function action_index() {
$employees = Employee::fetchAll();
}
}
Panoramica del database
FuelPHP fornisce il proprio livello di astrazione del database per recuperare i dati dal database. Fornisce strumenti ORM sia di base che avanzati. Il toolkit di base è costituito da classi basate su DB, DBUtil e Query_Builer. Il toolkit avanzato è Orm. Il toolkit Orm è derivato dal toolkit di base e fornito in bundle come pacchetto separato.
Configurazione del database
FuelPHP separa le impostazioni del database dal file di configurazione principale e il file è fuel/app/config/db.php. Supporta un'impostazione separata per ogni ambiente. Attualmente, FuelPHP supporta i driver MySQL, MySQLi e PDO. L'impostazione del campione è la seguente:
<?php
return array (
'development' => array (
'type' => 'mysqli',
'connection' => array (
'hostname' => 'localhost',
'port' => '3306',
'database' => 'tutorialspoint_fueldb',
'username' => 'root',
'password' => 'password',
'persistent' => false,
'compress' => false,
),
'identifier' => '`',
'table_prefix' => '',
'charset' => 'utf8',
'enable_cache' => true,
'profiling' => false,
'readonly' => false,
),
)
Toolkit basato su DB
Il DB classè l'opzione più semplice per accedere al database dall'applicazione. Fornisce opzioni per creare la query del database, eseguirla sul database di destinazione e infine recuperare il risultato. La classe DB interagisce con le seguenti classi e fornisce un'API di database completa.
Database_Connection - Singleton e classe principale per interagire con il database
Database_Query - Base, classe concreta per eseguire la query SQL e recuperare il risultato
Database_Query_Builder - Base, classe astratta per costruire query SQL
Database_Query_Builder_Join - Classe per costruire join SQL
Database_Query_Builder_Where - Classe astratta per creare condizioni di query SQL
Database_Query_Builder_Select - Classe concreta per costruire query di selezione SQL
Database_Query_Builder_Insert - Classe astratta per creare query di inserimento SQL
Database_Query_Builder_Update - Classe astratta per creare query di aggiornamento SQL
Database_Query_Builder_Delete - Classe astratta per creare query di eliminazione SQL
Il diagramma seguente illustra la relazione tra le classi ei metodi forniti dalle classi.
API DB
Impariamo i metodi più importanti disponibili nella classe DB in questa sezione.
esempio
Purpose- Crea e restituisce la nuova istanza Database_Connection .
Parameter -
$db - Nome della connessione al database definito nel file di configurazione, facoltativo.
Returns- Restituisce l' oggetto Database_Connection
Per esempio,
$db = DB::instance();
$db = DB::instance('test');
query
Purpose - Prepara l'istruzione SQL fornita e restituisce l'oggetto Database_Query, che può essere utilizzato per inserire, aggiornare, eliminare o recuperare i dati dal database.
Parameter -
$query - Istruzione SQL, può contenere segnaposto;
$type - Tipo SQL, opzionale (DB :: SELECT, DB :: INSERT, DB :: UPDATE e DB :: DELETE)
Returns- Restituisce l' oggetto Database_Query
Per esempio,
$query = DB::query('SELECT * FROM 'employees'');
last_query
Purpose - Per ottenere l'ultima query eseguita
Parameter - Nessuno
Returns - Restituisce l'ultima query eseguita
Per esempio,
$employees = DB::Select('Select * from 'employee'');
$sql = DB::last_query();
Selezionare
Purpose - Genera la parte selezionata della query
Parameter -
$columns - Elenco dei nomi delle colonne del database
Returns - Restituisce l'oggetto Database_Query_Builder_Select
Per esempio,
$query = DB::select(); // Select *
$query = DB::select('id', 'name'); // Select id, name
select_array (DB)
È simile a select tranne che possiamo inviare colonne come array.
$query = DB::select_array(array('id', 'name')); // Select id, name
inserire
Purpose - Genera la parte di inserimento della query
Parameter -
$table_name - nome della tabella del database;
$columns - matrice di colonne della tabella
Returns - Restituisce l'oggetto Database_Query_Builder_Insert
Per esempio,
$query = DB::insert('employee'); // Insert into employee
$query = DB::insert('employee', array('id', 'name')); // Insert into employee (id, name)
aggiornare
Purpose - Genera la parte di aggiornamento della query
Parameter -
$table_name - nome della tabella del database
Returns - Restituisce l'oggetto Database_Query_Builder_Update
Per esempio,
$query = DB::update('employee'); // update `employee`
Elimina
Purpose - Genera la parte di cancellazione della query
Parameter -
$table_name - nome della tabella del database
Returns - Restituisce l'oggetto Database_Query_Builder_Delete
Per esempio
$query = DB::delete('employee'); // delete from 'employee'
API Query
Database_Queryfornisce un'opzione per impostare la connessione al database, eseguire la query e recuperare il risultato come array o oggetto associativo. Vediamo i metodi forniti dalla classe Database_Query.
set_connection
Purpose - Per impostare il database (dettagli di connessione al database) su cui eseguire la query
Parameter - $ db - nome della connessione al database
Returns- Restituisce l' oggetto Database_Query
Per esempio,
$query = DB::query('DELETE * FROM employee', DB::DELETE);
$query->set_connection('2nd-db');
param
Purpose - Per impostare il valore del parametro definito nell'oggetto Query
Parameter -
$param - nome del parametro;
$value - valore del parametro
Returns- Restituisce l' oggetto Database_Query
Per esempio,
// set some variables
$table = 'employee';
$id = 1;
$name = 'Jon';
// don't use
$query = DB::query('SELECT * FROM '.$table.'. WHERE id = '.$id.' AND name = "'.$name.'"');
// but use
$query = DB::query('SELECT * FROM :tablename WHERE id = :id AND name = :name');
$query->param('tablename', 'employee');
$query->param('id', $id);
$query->param('name', $name);
Metodi simili
parameters è un oggetto simile tranne che fornisce l'opzione per dare più valori contemporaneamente.
$query->parameters (array(
'tablename' => $table,
'id' => $id,
'name' => $name
});
legare
Purpose - Per impostare una variabile sul parametro definito nell'oggetto Query
Parameter -
$param - nome del parametro
$var - la variabile a cui associare il parametro
Returns- Restituisce l' oggetto Database_Query
Per esempio,
// bind a query parameter
$table = 'employee';
$query = DB::query('DELETE * FROM :tablename', DB::DELETE);
$query->bind('tablename', $table);
// update the variable
$table = 'employee_salary';
// DELETE * FROM `employee_salary`;
$sql = $query->compile();
compilare
Purpose - Per compilare l'oggetto query definito nella query SQL
Parameter -
$db - stringa di connessione, opzionale
Returns -
Per esempio,
// assign a value to a query parameter
$table = 'employee';
$query = DB::query('DELETE * FROM :tablename', DB::DELETE);
$query->param('tablename', $table);
// compile the query, returns: DELETE * FROM employee
$sql = $query->compile();
eseguire
Purpose - Per eseguire la query definita nell'oggetto Query e restituire il risultato
Parameter -
$db - nome della connessione al database
Returns - Restituisce il risultato
Per esempio,
// assign a value to a query parameter
$table = 'employee';
$query = DB::query('DELETE * FROM :tablename', DB::DELETE);
$query->param('tablename', $table);
// execute the query
$query->execute();
as_assoc
Purpose - Per impostare il tipo restituito come array associativo invece che come oggetti
Parameter - Nessuno
Returns - Restituisce l'oggetto corrente
Per esempio,
$query = DB::query('SELECT * FROM employee', DB::SELECT);
$result = $query->as_assoc()->execute();
foreach ($result as $row) {
echo $row['id'];
}
as_object
Purpose - Per impostare il tipo restituito come oggetto anziché come array associativo
Parameter - Nessuno
Returns - Restituisce l'oggetto corrente
Per esempio,
$query = DB::query('SELECT * FROM employee', DB::SELECT);
$result = $query->as_object()->execute();
foreach ($result as $row) {
echo $row->id;
}
// have ORM model objects return instead
$result = $query->as_object('Model_Employee')->execute();
API Query Builder
Le classi basate su Query Builder (Query_Builder) forniscono opzioni per creare dinamicamente query SQL. Ha quattro classi, ciascuna per selezionare (Query_Builder_Select) , inserire (Query_Builder_Insert) , aggiornare (Query_Builder_Update) ed eliminare (Query_Builder_Delete) query. Queste classi derivano dalla classe Query_Builder_Where (opzione per generare condizioni), a sua volta derivata da Query_Builder , base di tutte le classi.
Diamo un'occhiata ai metodi forniti dalla classe Query_Builder.
Selezionare
Purpose - Per generare le colonne delle query selezionate.
Parameter -
$columns - elenco delle colonne, facoltativo
Returns - Restituisce l'istanza corrente
Per esempio,
$query = DB::select('name') // select `name`
$query = DB::select(array('first_name', 'name')) // select `first_name` as `name`
a partire dal
Purpose - Per generare i dettagli della tabella delle query selezionate
Parameter -
$tables - elenco delle tabelle
Returns - Restituisce l'istanza corrente
Per esempio,
$query = DB::select('name')->from('employee') // select `name` from `employee`
dove
Purpose - Per generare le condizioni di selezione, inserimento e aggiornamento delle query
Parameters -
$column - nome della colonna o array ($ colonna, $ alias);
$op - operatori logici, =,! =, IN, BETWEEN e LIKE, opzionali;
$value - valore della colonna
Returns - Restituisce l'istanza corrente
Per esempio,
$query = DB::select('name')->from('employee')
$query = $query->where('name', '=', 'Jon');
// select `name` from `employee` where `name` = `Jon`;
Metodi simili
I metodi simili sono where_open (), and_where_open (), or_where_open (), where_close (), and_where_close () o_where_close (). Sono simili ai metodi where () tranne per il fatto che aggiungono parole chiave e parentesi extra attorno alle condizioni. Di seguito è riportato un codice di esempio.
$query = DB::select('*')->from('employee');
$query->where('email', 'like', '%@gmail.com');
$query->or_where_open();
$query->where('name', 'Jon');
$query->and_where('surname', 'Peter');
$query->or_where_close();
// SELECT * FROM `employee` WHERE `email` LIKE "%gmail.com" OR
(`name` = "Jon" AND `surname` = "Peter")
aderire
Purpose - Per generare i join di tabella delle query selezionate
Parameters -
$table - nome o array della tabella ($ table, $ alias);
$type - tipo di join (LEFT, RIGHT, INNER, ecc.)
Returns - Restituisce l'istanza corrente
Esempio
$query = DB::select('name')->from('employee')->join('employee_salary')
// select `name` from `employee` JOIN `employee_salary`
sopra
Purpose - Per generare la condizione dei join nelle query selezionate
Parameters -
$c1 - nome della tabella o nome della tabella con alias in array;
$op - operatore logico;
$c2 - nome della tabella o nome della tabella con alias in array
Returns - Restituisce l'istanza corrente
Per esempio,
$query = DB::select('name')->from('employee')->join('employee_salary')
$query = $query->on('employee.employee_id', '=', 'employee_salary.employee_id')
// select `name` from `employee` JOIN `employee_salary` on
// `employee.employee_id` = `employee_salary.employee_id`
Metodi simili
I metodi correlati sono and_on () e or_on (). Sono simili a on () tranne per il fatto che aggiungono parole chiave e parentesi extra attorno ai join.
raggruppa per
Purpose - Per generare gruppo per query
Parameter - $columns - Nome della colonna in base al quale raggruppare il risultato
Returns - Restituisce l'istanza corrente
Per esempio,
$query = DB::select('name')->from('employee')
$query = $query->group_by('name');
// select `name` from `employee` group by `name`
avendo
Purpose - Per generare il gruppo in base alle condizioni delle query SQL
Parameter - $column - nome della colonna o array ($ colonna, $ alias); $op - operatori logici, =,! =, IN, BETWEEN e LIKE, opzionali; $value - valore della colonna
Returns - Restituisce l'istanza corrente
Esempio
$query = DB::select('name')->from('employee')
$query = $query->group_by('name');
$query = $query->having('name', '!=', 'Jon');
// select `name` from `employee` group by `name` having `name` != `Jon`
Metodi simili
I metodi simili sono having_open (), and_having_open (), or_having_open (), having_close (), and_having_close () o_having_close (). Sono simili ai metodi having () tranne per il fatto che aggiungono parole chiave e parentesi extra attorno alle condizioni.
Ripristina
Purpose - Per ripristinare la query
Parameter - Nessuno
Returns - Restituisce l'istanza corrente
Per esempio,
$query = DB::select('name')->from('employee')
$query->reset()
$query = DB::select('name')->from('employee_salary')
// select `name` from `employee_salary`
Classe DBUtil
La classe DBUtil fornisce un'opzione per gestire ed eseguire operazioni di database di routine. Alcuni dei metodi importanti sono i seguenti:
- set_connection - Imposta la connessione predefinita
DBUtil::set_connection('new_database');
- create_database - Crea un database.
DBUtil::create_database('my_database');
- drop_database - Elimina un database.
DBUtil::drop_database('my_database');
- table_exists - Controlla se esiste una determinata tabella.
if(DBUtil::table_exists('my_table')) {
// Table exists
} else {
// Table does NOT exist, create it!
}
- drop_table - Elimina una tabella.
DBUtil::drop_table('my_table');
- create_table - Crea una tabella.
\DBUtil::create_table (
'users',
array (
'id' => array('type' => 'int', 'auto_increment' => true),
'name' => array('type' => 'text'),
),
);
Orm Toolkit
FuelPHP fornisce un livello di database avanzato utilizzando il concetto ORM basato sul popolare Active record pattern. Il toolkit è incluso nell'applicazione ma non è configurato per impostazione predefinita. È raggruppato come pacchetto e il nome del pacchetto è orm. Possiamo aggiungere la seguente configurazione nel file di configurazione principale,fuel/app/config/config.php per caricare il toolkit orm.
'always_load' => array (
'packages' => array (
'orm',
),
),
Creazione di modelli
Orm fornisce la classe del modello base Orm \ Model. Dobbiamo estendere i nostri modelli con il modello orm per utilizzare le funzionalità ORM. Di seguito è riportato un codice di esempio.
class Model_Employee extends Orm\Model {}
Configurazione
Orm fornisce una serie di impostazioni per configurare il modello in modo che utilizzi le funzionalità ORM. Sono i seguenti:
connection- Impostare una proprietà _connection statica nel modello per specificare il nome della connessione.
class Model_Employee extends Orm\Model {
protected static $_connection = "production";
}
table name- Impostare una proprietà _table_name statica nel modello per specificare il nome della tabella della tabella di backend.
class Model_Employee extends Orm\Model {
protected static $_table_name = 'employee';
}
primary key- Imposta una proprietà _primary_key statica nel modello per specificare la chiave primaria della tabella di backend.
class Model_Employee extends Orm\Model {
protected static $_primary_key = array('id');
}
Columns- Impostare una proprietà _properties statica nel modello per specificare le colonne della tabella di backend. Supporta data_type, label, validation, form elememts, ecc.
class Model_Employee extends Orm\Model {
protected static $_properties = array (
'id',
'name' => array (
'data_type' => 'varchar',
'label' => 'Employee Name',
'validation' => array (
'required',
'min_length' => array(3),
'max_length' > array(80)
),
'form' => array (
'type' => 'text'
),
),
'age' => array (
'data_type' => 'int',
'label' => 'Employee Age',
'validation' => array (
'required',
),
'form' => array (
'type' => 'text'
),
),
);
}
Conditions- Impostare una proprietà _conditions statica per impostare le condizioni e l'ordine per opzioni.
class Model_Employee extends Orm\Model {
protected static $_conditions = array (
'order_by' => array('id' => 'desc'),
'where' => array (
array('is_active', > true),
),
);
}
Observers- Orm fornisce un sistema di eventi basato sull'osservatore per aggiungere comportamenti a eventi specifici. Per aggiungere un comportamento, impostare prima una proprietà _observers nel modello. Quindi, definire il comportamento come una classe e impostarlo nella proprietà _observers insieme agli eventi. Se non viene specificato alcun evento, il comportamento verrà richiamato per tutti gli eventi. Possiamo anche specificare più comportamenti.
class Model_Employee {
protected static $_observers = array (
'example', // will call Observer_Example class for all events
'Orm\\Observer_CreatedOn' => array (
'events' => array('before_insert'),
// will only call Orm\Observer_CreatedOn at before_insert event
)
);
}
Creare
Una volta configurato il modello, possiamo iniziare a utilizzare i metodi immediatamente. Orm fornisce un risparmio metodo per salvare l'oggetto nel database. Possiamo impostare i dati utilizzando le proprietà configurate come segue:
// option 1
$new = new Model_Employee();
$new->name = 'Jon';
$new->save();
// option 2, use forge instead of new
$new = Model_Employee::forge();
$new->name = 'Jon';
$new->save();
// option 3, use array for properties
$props = array('name' => 'Jon');
$new = Model_Employee::forge($props);
$new>save();
Leggere
Orm fornisce un metodo, find per recuperare i dati dal database e collegarli all'oggetto. Il metodo find funziona a seconda del parametro di input. Diamo un'occhiata alle diverse opzioni:
by primary key - La specifica della chiave primaria restituisce il record facendo corrispondere la chiave primaria della tabella configurata.
$employee = Model_Employee::find(1);
first / last record- Se si specifica "primo" o "ultimo", verrà recuperato rispettivamente il primo o l'ultimo record. Possiamo anche passare l'ordine per opzione.
$entry = Model_Employee::find('first');
$entry = Model_Article::find('last', array('order_by' => 'id'));
All- Specificando "all" verranno recuperati tutti i record dalla tabella configurata. Possiamo specificare l'ordine per opzione e condizioni.
$entry = Model_Employee::find('all');
$entry = Model_Article::find ('all', array (
'where' => array (
array ('name', 'Jon'),
),
'order_by' => array ('id' => 'desc'),
));
Possiamo usare Query API del toolkit di database di base insieme al modello per l'opzione di ricerca avanzata come segue.
$query = Model_Employee::query()->where('category_id', 1)->order_by('date', 'desc');
$number_of_employees = $query->count();
$latest_employee = $query->max('id');
$young_employee = $query->min('age');
$newest_employee = $query->get_one();
$employees = $query->limit(15)->get();
Aggiornare
L'aggiornamento del modello è lo stesso della creazione, tranne che invece di creare un nuovo modello è sufficiente recuperare il modello da aggiornare utilizzando il metodo find, aggiornare la proprietà e quindi chiamare il metodo di salvataggio come segue.
$entry = Model_Employee:find(4);
$entry->name = 'Peter';
$entry->save();
Elimina
Orm fornisce un metodo di eliminazione per eliminare il modello. Basta recuperare l'oggetto e chiamare il metodo di eliminazione.
$entry = Model_Employee:find(4);
$entry->delete();
Esempio di lavoro
Creiamo un esempio funzionante in questo capitolo per comprendere il modello e il database.
Crea un database
Crea un nuovo database nel server MySQL, utilizzando il seguente comando.
create database tutorialspoint_fueldb
Quindi, crea una tabella all'interno del database utilizzando il seguente comando.
create table employee(id int primary key, name varchar(20), age int not null);
Configura il database
Cerchiamo di configurare il database utilizzando il file di configurazione del database, * fuel / app / config / db.php. Aggiungi le seguenti modifiche per connettere il server MySQL.
<?php
return array (
'development' => array (
'type' => 'mysqli',
'connection' => array (
'hostname' => 'localhost',
'port' => '3306',
'database' => 'tutorialspoint_fueldb',
'username' => 'root',
'password' => 'pass',
'persistent' => false,
'compress' => false,
),
'identifier' => '`',
'table_prefix' => '',
'charset' => 'utf8',
'enable_cache' => true,
'profiling' => false,
'readonly' => false,
),
'production' => array (
'type' => 'mysqli',
'connection' => array (
'hostname' => 'localhost',
'port' => '3306',
'database' => 'tutorialspoint_fueldb',
'username' => 'root',
'password' => 'pass',
'persistent' => false,
'compress' => false,
),
'identifier' => '`',
'table_prefix' => '',
'charset' => 'utf8',
'enable_cache' => true,
'profiling' => false,
'readonly' => false,
),
);
Includi pacchetto ORM
Aggiorna il file di configurazione principale, fuel/app/config/config.php per includere il pacchetto ORM aggiungendo la seguente configurazione.
'always_load' => array (
'packages' => array (
'orm'
),
),
Ora ORM è abilitato nella tua applicazione
Crea modello dipendente
Crea un nuovo modello, Dipendente nella cartella del modello “fuel/app/classes/model”. È definito come segue.
Employee.php
<?php
class Model_Employee extends Orm\Model {
protected static $_connection = 'production';
protected static $_table_name = 'employee';
protected static $_primary_key = array('id');
protected static $_properties = array (
'id',
'name' => array (
'data_type' => 'varchar',
'label' => 'Employee Name',
'form' => array (
'type' => 'text'
),
),
'age' => array (
'data_type' => 'int',
'label' => 'Employee Age',
'form' => array (
'type' => 'text'
),
),
);
}
Crea azione
Crea nuova azione, action_model in Controller dei dipendenti situato in fuel/app/classes/controller/employee.php come segue.
class Controller_Employee extends Controller {
public function action_model() {
// db based sql command to delete all employees
$query = db::query('delete from `employee`');
$query->execute('production');
// orm based query to add new employees
$model = new model_employee();
$model->name = "john";
$model->age = 25;
$model->save();
$model = new model_employee();
$model->name = "peter";
$model->age = 20;
$model->save();
// orm based query to fetch all employee data
$data = array();
$data['emps'] = model_employee::find('all');
return response::forge(view::forge('employee/model', $data));
}
}
Crea vista
Ora, crea un file di visualizzazione model.php situato in “fuel/app/views/employee”. Aggiungi le seguenti modifiche al file.
<ul>
<?php
foreach($emps as $emp) {
?>
<li><?php echo $emp['name']; ?></li>
<?php
}
?>
</ul>
Ora, richiedi l'URL, http://localhost:8080/employee/model e produrrà il seguente risultato.