Transtypage - Dates, Blobs et Null

Transtypage - Dates, Blobs et Null – DB_DataObject_Cast ::date(), ::blob(), ::sql()

Travailler avec le transtypage (tout type excepté les chaînes de caractères et le nombres)

Ceci est expérimental ! Bien que ce soit documenté, c'est actuellement supporté uniquement sur une liste limitée de base de données (envoyez-moi des patchs si vous voulez que cela supporte votre base de données favorites) et l'API interne devrait changer dans le futur...

DataObjects est une façon très simple de travailler avec les bases de données qui sont focalisées sur les nombres et les chaînes de caractères. Vous pouvez également l'utiliser sur les champs date (bien que vous deviez formater vos chaînes correctement) et vous pouvez l'utiliser avec d'autres types en utilisant des requêtes SQL spéciales, et la chaîne de caractères "null" est automatiquement convertie en NULL dans la base de données.

Dans un but de fournir une façon claire de coder les types riches de base de données, l'objet DB_DataObject_Cast a été créé. Il propose de créer simplement un objet représentant la plus part des types les moins fréquemment utilisés. A suivre, un exemple d'utilisation pour créer quelques types simples.

L'objet de transtypage peut être utilisé dans la construction de la requête et dans l'assignement de valeurs.

L'objet de transtypage pour construire et assigner des valeurs

<?php

// utiliser l'objet de transtypage pour construire une requête.
$person DB_DataObject::factory('person');

// assigner la valeur d'un anniversaire par un objet de transtypage avec une date.
$person->birthday =  DB_DataObject_Cast::date(2000,12,30);

$person->find();
while (
$person->fetch()) {
    echo 
"{$person->name} a son anniversaire le 30 décembre 2002<br />";
}

// utiliser l'objet de transtypage pour assigner des valeurs.
$person DB_DataObject::factory('person');
$person->get(12);

// définir l'anniversaire de la personne au 30 décembre 2000
$person->birthday DB_DataObject_Cast::date(2000,12,30);

// maintenant, on met à jour la base de données.
$person->update();
?>

Comme vous pouvez le voir, ce composant est basique, donc, si vous voulez d'autres fonctionnalités, si vous avez des idées, n'hésitez surtout pas à me contacter à l'adresse email alan_k at php dot net.

Les types Blob et String

Les champs de type Blob peuvent stocker une grande quantité de données binaires dans une base de données.

Actuellement, seuls les types Blob sont supportés dans PostGres en utilisant le type de bites. (merci de me contacter avec un patch pour les autre bases de données)

Insertion d'une photo et d'un gros fichier texte

<?php

$person 
DB_DataObject::factory('person');
$person->name 'fred'

// utilisation d'un champs de type Blob pour des données binaires.
$person->photo =  DB_DataObject_Cast::blob(file_get_contents('xxx.jpg'));

// utilisation d'une chaîne de caractères pour les données textuelles dans un champs de type Blob.
$person->xmldocs =  DB_DataObject_Cast::string(file_get_contents('xxx.xml'));

// maintenant, on insert dans la base de données.
$person->insert();

?>

Le type Date

La plupart des dates sont stockées dans une base de données au format standard ISO, cette méthode vous permet de créer des types Date, depuis soit l'année, le mois, le jour, humainement lisibile (jour/mois/année) ou au format ISO standard année-mois-jour. Il complète les valeurs restantes en se basant sur des règles simples.

Insertion d'une date dans divers formats

<?php

$person 
DB_DataObject::factory('person');
$person->name 'fred'

// utilisation d'une date humainement lisibile

// format complet
$person->birthday = new DB_DataObject_Cast::date('21/12/2003');

// utilisation seulement du mois/année - actuellement définie au 1 décembre 2003
$person->expires =  DB_DataObject_Cast::date('12/2003');

// utilisation uniquement de l'année - actuellement définie au 1 jan 2003
$person->expires DB_DataObject_Cast::date(2003);

// utilisation du format standard ISO
// format complet
$person->birthday =  DB_DataObject_Cast::date('2003-12-21');

// utilisation seulement du année-mois - actuellement définie au 1 décembre 2003
$person->expires =  DB_DataObject_Cast::date('2003-12');

// utilisation d'une syntaxe avec tableau
// format complet
$person->birthday =  DB_DataObject_Cast::date(2003,12,21);

// utilisation seulement du année-mois - actuellement définie au 1 décembre 2003
$person->expires =  DB_DataObject_Cast::date(2003,12);

// les valeurs réelles sont sotckées dans una variable objet
echo $person->birthday->year// affiche 2003
echo $person->birthday->month// affiche 12
echo $person->birthday->day// affiche 21

// vous pouvez effectuer des additions simples de date (similaire à mktime)
$d DB_DataObject_Cast::date('01/12/2003');

$nextMonth DB_DataObject_Cast::date($d->year,$d->month+1,1);
?>

Le type SQL

Quelques types sont spécifiques à SQL ou sont spécifiques une la base de données, vous pouvez dans ce cas, utiliser le type SQL pour mettre une chaîne particulière dans un traitement SQL.

Utilisation particulière de SQL

<?php
$person 
DB_DataObject::factory('person');
$person->get(12);

// définition de l'anniversaire à NULL.
$person->birthday =  DB_DataObject_Cast::sql('NULL');

// exécution d'un traitement SQL de transtypage (spécifique à PostGres)
$data DB_DataObject_Cast::sql('cast("123123",datetime)');

// maintenant, on insert dans la base de données.
$person->insert();

?>

Lance une erreur (Previous) DB_DataObject_FormBuilder (Next)
Last updated: Sun, 29 Aug 2010 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: monkeboy
Don't forget to add the include:

include_once 'DB/DataObject/Cast.php';

You need to do the following to use the SQL NOW() datetime function:

$table->created_on = DB_DataObject_Cast::sql('NOW()');
$table->update();

Hope that helps someone.

(I'm not sure if I agree that this is a cast function, I think it is more like a 'raw' or 'do not escape', i thought casting was changing data types, e.g. string to int is a cast. But who cares what name it has -- it works :-) )

monk.e.boy