Aller au contenu principal
Version: 5.x

đŸ§© ORM Barry


BARRY ORM

BARRY c'est l'ORM (Object Relation Mapping) intégré dans Bow Framework.

Introduction​

Un ORM c'est une façon de rĂ©lier les tables entre elles en utilisant des classes. Ici chaque enregistrement d'une table reprĂ©sentera un Objet qui peut ĂȘtre en rĂ©lation avec d'autre enregistrement. C'est ce qu'on appel en anglais The Object Relation Mapping et en français ben, Mappage de rĂ©lation en Objet 😉.

L'ORM BARRY inclus avec Bow Framework fournit une implémentation ActiveRecord belle et simple pour travailler avec votre base de données. Chaque table de base de données a un "modÚle" correspondant qui est utilisé pour interagir avec cette table. Les modÚles vous permettent de rechercher des données dans vos tables, ainsi que d'insérer de nouveaux enregistrements dans la table.

Dans tout bon Framework qui se respect, il y a un systĂšme de ORM et qui possĂ©de un nom super mignon. Celui de Bow se nomme BARRY, n'est pas mignon ça 😄.

Avant de commencer, assurez-vous de configurer une connexion à la base de données dans config/database.php.

Avant de continuer veuillez ajouter une migration:

php bow add:migration CreateTodoTable

Ensuite modifiez la migration:

public function up()
{
$this->create("todos", function (SQLGenerator $table) {
$table->addIncrement('id');
$table->addString('title');
$table->addString('status', 0);
$table->addInteger('budget', 0);
$table->addTimestamps();
});
}

En fin de faire la migration:

php bow migration:migrate

Cette migration sera utilisé pour vous permettre de faire directement les tests sur le modÚle App\Models\Todo::class.

Ajouter un model​

Pour ajouter un modĂȘle il faut utiliser la ligne de commande php bow avec la commande add:model suivi du nom du model.

php bow add:model Todo

AprÚs création du modele, un fichier du meme nom sera créer, dans note cas Todo.php, à la racine du dossier app/Models.

Voici un aperçu du fichier:

namespace App\Models;

use Bow\Database\Barry\Model;

class Todo extends Model
{
//
}

Avant d'utiliser le model vérifier que vous avez configurer votre base de donnée

Nom de Table​

Notez que nous n'avons pas indiqué à BARRY quelle table utiliser pour notre modÚle Todo. Par convention, le "snake case", le nom pluriel de la classe sera utilisé comme nom de table à moins qu'un autre nom ne soit explicitement spécifié.

Vous pouvez spécifier manuellement un nom de table en définissant une propriété de table sur votre modÚle:

namespace App\Models;

use Bow\Database\Barry\Model;

class Todo extends Model
{
/**
* Définissez la table associée au modÚle.
*
* @var string
*/
protected $table = 'tbl_todos';
}

ClĂ©s primaires​

BARRY supposera également que chaque table a une colonne de clé primaire nommée id. Vous pouvez définir une propriété $primary_key protégée pour remplacer cette convention:

namespace App\Models;

use Bow\Database\Barry\Model;

class Todo extends Model
{
/**
* La clé primaire associée à la table.
*
* @var string
*/
protected $primary_key = 'id_todo';
}

RĂ©cupĂ©rer les donnĂ©es​

Une fois que vous avez crĂ©Ă© un modĂšle et sa table de base de donnĂ©es associĂ©e, vous ĂȘtes prĂȘt Ă  commencer Ă  rĂ©cupĂ©rer les donnĂ©es de votre base de donnĂ©es. ConsidĂ©rez chaque modĂšle BARRY comme un puissant gĂ©nĂ©rateur de requĂȘtes vous permettant d'interroger couramment la table de base de donnĂ©es associĂ©e au modĂšle.

Par exemple:

use App\Models\Todo;

$todos = Todo::all();

foreach ($todos as $todo) {
echo $todo->title;
}

La méthode find et findBy permet aussi de récupérer les informations:

// Avec find
$todo = Todo::find(1);

// Avec findBy
$todo = Todo::findBy('id', 1);

La méthode peut aussi retourner null dans le case ou il y a aucun enrégistrement trouvé

Ajout de contraintes supplĂ©mentaires​

La mĂ©thode BARRY all retournera tous les rĂ©sultats dans le tableau du modĂšle. Étant donnĂ© que chaque modĂšle BARRY sert de gĂ©nĂ©rateur de requĂȘtes, vous pouvez Ă©galement ajouter des contraintes aux requĂȘtes, puis utiliser la mĂ©thode get pour rĂ©cupĂ©rer les rĂ©sultats:

$flights = App\Models\Todo::where('status', 'done')
->orderBy('titie', 'desc')
->take(10)
->get();

RĂ©cupĂ©ration d'agrĂ©gats​

Vous pouvez Ă©galement utiliser les mĂ©thodes count, sum, max et d'autres mĂ©thodes d'agrĂ©gation fournies par le gĂ©nĂ©rateur de requĂȘtes. Ces mĂ©thodes renvoient la valeur scalaire appropriĂ©e au lieu d'une instance de modĂšle complĂšte:

use App\Models\Todo;

$count = Todo::where('status', 'done')->count();

$max = Todo::where('status', 'done')->max('budget');

Insertion et mise à jour de modùles​

INSERT​

Pour créer un nouvel enregistrement dans la base de données, créez une nouvelle instance de modÚle, définissez des attributs sur le modÚle, puis appelez la méthode de sauvegarde:


namespace App\Http\Controllers;

use App\Controllers\Controller;
use App\Models\Todo;
use Bow\Http\Request;

class TodoController extends Controller
{
/**
* Créez une nouvelle instance de todo.
*
* @param Request $request
* @return mixed
*/
public function store(Request $request)
{
// Validez la demande...

$todo = new Todo;

$todo->title = $request->get('title');
$todo->budget = $request->get('budget', 0);
$todo->status = 'pending';

$todo->save();
}
}

Dans cet exemple, nous affectons le paramĂštre de nom de la requĂȘte HTTP entrante Ă  les attributs title, budget de l'instance de modĂšle App\Models\Todo. Lorsque nous appelons la mĂ©thode save, un enregistrement sera insĂ©rĂ© dans la base de donnĂ©es. Les horodatages created_at et updated_at seront automatiquement dĂ©finis lorsque la mĂ©thode de sauvegarde sera appelĂ©e, il n'est donc pas nĂ©cessaire de les dĂ©finir manuellement.

Insert via CREATE​

Les objets Active Record peuvent ĂȘtre crĂ©Ă©s Ă  partir d'un hachage, d'un bloc ou avoir leurs attributs dĂ©finis manuellement aprĂšs la crĂ©ation. La nouvelle mĂ©thode renverra un nouvel objet tandis que create renverra l'objet et l'enregistrera dans la base de donnĂ©es.

Par exemple, étant donné un utilisateur modÚle avec des attributs de nom et d'occupation, l'appel de la méthode create créera et enregistrera un nouvel enregistrement dans la base de données:

use App\Models\Todo;

$user = Todo::create([
'title' => 'Acheter un ticket metro',
'budget' => 2000,
'status' => 'pending',
]);

UPDATE​

La mĂ©thode save peut Ă©galement ĂȘtre utilisĂ©e pour mettre Ă  jour des modĂšles qui existent dĂ©jĂ  dans la base de donnĂ©es. Pour mettre Ă  jour un modĂšle, vous devez le rĂ©cupĂ©rer, dĂ©finir les attributs que vous souhaitez mettre Ă  jour, puis appeler la mĂ©thode save. Encore une fois, l'horodatage updated_at sera automatiquement mis Ă  jour, il n'est donc pas nĂ©cessaire de dĂ©finir manuellement sa valeur:

use App\Models\Todo;

$todo = Todo::find(1);

$todo->title = 'Shopping pour Franck';

$todo->save();

Ou bien vous pouvez aussi utiliser la methode update. Seulement vous dévez definir les conditions pour ainsi limiter l'impact de la mise à jour.

use App\Models\Todo;

Todo::where('status', 'done')
->update(['title' => 'Achat de ticket d\'avion']);

La méthode update attend un tableau de paires de colonnes et de valeurs représentant les colonnes à mettre à jour.

Suppression de donnĂ©e​

De mĂȘme, une fois rĂ©cupĂ©rĂ©, un objet Active Record peut ĂȘtre dĂ©truit, ce qui le supprime de la base de donnĂ©es.

use App\Models\Todo;

$todo = Todo::find(1);
$todo->delete();

Si vous souhaitez supprimer plusieurs enregistrements en masse, vous pouvez utiliser la méthode destroyBy ou truncate:

// Delete all todo by id
Todo::deleteBy('id', 'David');

// delete all todo
Todo::truncate();

Il manque quelque chose ?

Si vous rencontrez des problÚmes avec la documentation ou si vous avez des suggestions pour améliorer la documentation ou le projet en général, veuillez déposer une issue pour nous, ou envoyer un tweet mentionnant le compte Twitter @bowframework ou sur directement sur le github.