Administrateur PHPfrance |
3131 Messages
16 janv. 2009, 11:32
Je ferais une méthode
getWhere(array $where, string $joins = null, string $groupby = null, int $limit = null)
où $where est un tableau associatif de la forme "nom du champ" => "valeur" ou "nom du champ" => array("valeur", "opérateur"), et ensuite à chaque fois que tu as un besoin qui peut s'exprimer (du type "getByDate", "getAll", etc...) tu crées la méthode correspondante, qui appelle celle-là.
Dans cette méthode tu t'occuperas de construire la where-clause à partir de ce tableau associatif, de faire les échappements nécessaire (valeurs séparés par des virgules dans le cas d'un array, échappements dans le cas d'une chaine, etc...) et d'exécuter la requête SELECT et de renvoyer la liste des résultats transformés.
Pour pouvoir gérer tout ce qui est cas particulier, tu pourras ajouter comme je l'ai fait des arguments supplémentaires à traiter "tel quel" :
function getWhere(array $where = array(), $joins = null, $groupby = null, $orderby = null, $limit = null)
{
// 1. Construire la where-clause
$where_clause = '...'; // c'est la partie la plus intéressante, je ne vais pas te priver de ce plaisir :)
// 2. Constuire la requête (exemple de façon dont on pourrait générer cette requête)
$sql = sprintf('SELECT %s FROM %s %s WHERE %s %s %s %s',
$fields, $table_name,
!is_null($joins) ? 'JOIN '.$joins : '',
$where_clause,
!is_null($groupby) ? 'GROUP BY '.$groupby : '',
!is_null($orderby) ? 'ORDER BY '.$orderby : '',
!is_null($limit) ? 'LIMIT '.$limit);
// 3. Exécuter la requête, extraire les résultats et transformer ça en array of Entree
return array(...); // là ça dépend de ton environnement
}
/**
* Renvoie la liste des entrées, sauf celles dont l'ID est indiqué
*
* @param array $ids Excluded IDs (si vide, renvoie tout)
* @return array
*/
function getAllBut(array $ids = array())
{
return $this->getWhere(array(
'id' => array($ids, 'NOT IN'),
));
}
/**
* Renvoie les entrées
*
* @param array $ids Ne renvoyer que les entrées ayant un de ces IDs (si vide, renvoie tout)
* @return array
*/
function getAll(array $ids = array())
{
return $this->getWhere(array(
'id' => array($ids, 'IN'),
));
}
/**
* Renvoie une entrée par son ID
*
* @param int $id
* @return Entree
*/
function getByID($id)
{
$results $this->getAll(array($id));
return @$results[0];
}
/**
* Renvoyer les dernières entrées
*
* @param int $nb
* @return array
*/
function getLast($nb = 1)
{
return $this->getWhere(array(), null, null, 'date DESC', $nb);
}