Récupération et sauvegarde des données

Catégorie : Modèles
Cet article est une traduction de Models.

Qu'est-ce qu'un modèle ?
Les modèles vous permettent de faire l'interaction avec les données logiques de votre application. Ils sont également utilisés pour faire le lien avec votre base de données. En l'occurence, il doit exister un modèle pour chaque table de votre base.

Voici un exemple de modèle :

//AppModel vous apporte toutes les fonctionnalités des modèles

class User extends AppModel
{
    // Il faut toujours préciser le nom du modèle
    var $name = 'User';

    //Ceci est utilisé pour la validation des données
    var $validate = array();

    // Vous pouvez également définir les associations
    var $hasMany = array('Image' =>
                   array('className' => 'Image')
                   );

    // Et inclure vos propres méthodes :
    function makeInactive($uid)
    {
        //Placez votre code ici
    }
}
?>


Du point de vue de PHP, un modèle est une classe héritée de AppModel. Classe qui se trouve par défaut dans cake/.
Vous pouvez modifier cette classe, afin d'y ajouter des méthodes communes à tous vos modèles en créant app/app_model.php. Il devra lui même hériter de la classe Model, qui est située dans cake/libs/models/php.

Dans la partie suivante, nous allons vous présenter les principales fonctions accessibles avec les modèles. Cette liste n'est pas exhaustive. Pour cela, référez vous à api.cakephp.org.

Récupération des données
Il existe plusieurs fonctions permettant de récupérer les données dont vous avez besoin :
  • findAll
    • string $conditions
    • array $fields
    • string $order
    • int $limit
    • int $page
    • int $recursive
Cette fonction vous retournera les $limit premiers éléments de la page $page (défaut : 1) de votre table SQL, respectant $conditions.

L'option $recursive permet de définir le niveau de récursivité au niveau des relations entre les tables.
Ainsi, si vous avez trois modèles : Categorie, Article et User et que dans Categorie, vous faites un findAll,
Si $recursive prends la valeur 1, vous n'aurez que les données de Categorie.
Avec la valeur 2, vous aurez également les données de Article.
Et avec la valeur 3, vous aurez les données de User.

  • find
    • string $conditions
    • array $fields
    • string $order
    • int $recursive
Cette fonction vous retourne le premier élément de la requête respectant $conditions.

  • findAllBy
    • string $value
Cette fonction "magique" permet de récupérer les éléments de la table dont le champ a pour valeur $value.
Ainsi, $this->findAllByTitle('Mon premier blog');
vous retounera tous les enregistrements dont le titre est 'Mon premier blog'.

  • findNeighbours
    • string $conditions
    • array $field
    • string $value
Cette fonction vous permet de récupérer les éléments précédents et suivants de l'uplet dont le champ $field a pour valeur $value.
Cela peut être utile pour une galerie photos par exemple. Avec :

class ImagesController extends AppController
{
    function view($id)
    {
        // On définit l'image
        $this->set('image', $this->Image->find("id = $id");

        //Ainsi que les suivantes et précédentes
        $this->set('neighbours', $this->Image->findNeighbours(null, 'id', $id);

    }
}


Vous aurez alors trois tableaux :
$image, qui contiendra les données concernant l'image courante
$neighbours['prev'], qui contiendra les données de l'image précédente
$neighbours['next'], qui contiendra les données de l'image suivante

  • field
    • string $name
    • string $conditions
    • string $order
Retourne la valeur du champ $name du premier uplet respectant $conditions

  • findCount
    • string $conditions
Retourne le nombre d'uplets respectant $conditions

  • generateList
    • string $conditions
    • string $order
    • int $limit
    • string $keyPath
    • string $valuePath
Permet de générer un tableau ayant pour clés la valeur du champ $keyPath et pour valeur la valeur du champ $valuePath.
Cela peut être très utile pour générer des listes déroulantes.

Exemple :
$this->set(
    'Categorie',
    $this->Categorie->generateList(null, 'name ASC', null, '{n}.Categorie.id', '{n}.Categorie.name')
);


Vous obtiendrez un tableau contenant par exemple :
array(
    '1' => 'Actualités',
    '2' => 'Tutoriels',
    '3' => 'Manuel',
    '4' => 'Portions de code'
);


  • read
    • string $fields
    • string $id
Utilisez cette fonction pour récupérer les valeurs des champs $fields de l'enregistrement courant ou de l'enregistrement spécifié par $id.

  • query
    • string $query
  • execute
    • string $query
Execute la requête SQL spécifiée par $query.
La différence entre les deux fonctions est que query() permet l'execution de requêtes SQL, retournant un résultat.
Alors que execute() permet l'exécution de commandes SQL, ne retournant pas de résultat.

Sauvegarde des données
La fonction de sauvegarde des données du moteur SQL vous permet de gérer l'ajout ou la modification de données automatiquement, le moteur détectant la meilleure méthode à adopter.

Vous devez pour cela avoir des données dans un tableau au format :
Array
(
[NomDuModèle] => Array
(
[champ1] => 'valeur'
[champ2] => 'valeur'
)
)

Vous pouvez, dans vos formulaire, afin d'obtenir vos données directement dans ce format, utiliser l'helper HTML.
Par exemple, pour ajouter un champ de texte :
input('Article/title'); ?>


Les données à ce format sont passées directement dans la variable $this->data de votre controlleur.
Vous n'avez plus qu'à sauvegarder vos données :

if ($this->Article->save($this->data)) {
$this->Session->setFlash('Vos données ont correctement été sauvegardées');
} else {
$this->Session->setFlash('Erreur lors de la sauvegarde des données. Annulée.');
}


Il existe également d'autres fonctions vous permettant de manipuler les données dans votre table :
  • del
    • string $id
    • boolean $cascade
Supprime l'enregistrement ayant pour identifiant $id. Si $cascade vaut true, le moteur supprimera également tous les éléments des tables associées en rapport et donc l'association est définie comme dépendante.

  • saveField
    • string $name
    • string $value
Utilisé pour sauvegarder une unique valeur dans un unique champ. Déconseillé. Préférez utiliser save() lorsque c'est possible.

  • getLastInsertID
Retourne l'identifiant du dernier uplet inséré dans la table.

Callbacks
Il existe plusieurs fonctions qui sont appellées automatiquement à certaines étapes de la vie d'un modèle. Vous pouvez créer ces méthodes dans votre modèle, elles seront appellées automatiquement au moment opportun.
En voici la liste :

  • beforeFind
    • string $conditions
Cette méthode est appellée avant une opération de recherche. Elle doit retourner un boolén. Si elle retourne false, la recherche n'aura pas lieu.

  • afterFind
    • array $results
Cette méthode est appellée après une opération de recherche. $results comprends le résultat obtenu par la recherche. Elle doit retourner le résultat modifié.

  • beforeValidate
Cette méthode est appellée avant la validation de vos données. Les données y sont disponibles dans la variable $this->data. Elle doit retourner true sans quoi le save n'aura pas lieu.

  • beforeSave
Cette fonction est appellée après la précédente et fonctionne de la même manière. Elle doit également retourner true pour que save soit executé.

  • afterSave
Méthode appellée après un save.

  • beforeDelete
Méthode appellée avant toute suppression d'uplets dans la base. Doit retourner true pour que la suppression ait lieu.

  • afterDelete
Méthode appellée après toute suppression de données dans la base.



Identification

Statistiques

128 utilisateurs
32 articles
6 connectes

CakePHP-fr

Actualites

PHP 5.2.2 et PHP 4.4.7
L'équipe de développement de PHP ...
Poste le : 04/05/2007


Nouvelles version CakePHP
Deux nouvelles versions de Cake voient le jour ...
Poste le : 06/04/2007


PHP 4.4.6
L'équipe de développement de PHP ...
Poste le : 01/03/2007


Sortie de PHP 5.2.1
L'équipe de développement de PHP ...
Poste le : 09/02/2007


Cake 1.1.13.4450 et 1.2.0.4451alpha
PhpNut nous l'annonce aujourd'hui, les versions...
Poste le : 05/02/2007


Liens