Rev 27 |
    Blame |
    Compare with Previous |
    Last modification |
    View Log
    | RSS feed
  
  
    1
  
  
<?php
require_once __DIR__ 
. '/../Model.php';
abstract class Adapter
{
  /**
   * Database used by the adapter
   * @var Database
   */
  protected $_database = null;
  /**
   * Constructs the adapter, associating a {@link Database} with it
   * @param Database $database
   */
  /* Singleton */
  protected function __construct
(Database 
$database)
  {
    $this->_database 
= $database;
  }
  
  /**
  * Selects data from one or more tables
  *
  * @return array
  * @see Database::select()
  */
  public function select
($table, $columns = null, $where = null, $order = null, $limit = null)
  {
    return $this->_database
->select($table, $columns, $where, $order, $limit);
  }
  
  /**
   * Finds all records matching the set properties of a model object
   *
   * @param Model $object
   * @return array[Model]
   */
  public function findAll
(Model 
$object, $order = null, $limit = null)
  {
    $properties = $object->getPropertyVars();
    $where = array();
    
    foreach ($properties as $property)
    {
      if (!is_null($object->$property))
      {
        $where[$property] = $object->$property;
      }
    }
    
    $class = get_class($object);
    $query_result = $this->select($class::persistentTable, null, $where, $order, $limit);
    
    $num_results = count($query_result);
    if ($num_results === 0)
    {
      return null;
    }
    $result = array();
    
    foreach ($query_result as $row)
    {
      $result[] = new $class($row);
    }
    return $result;
  }
  
  /**
   * Finds the record for a model object by its primary key
   *
   * @param Model $object
   * @return Model
   *   The filled object if the primary key value could be found,
   *   <code>null</code> otherwise
   */
  public function find
(Model 
$object)
  {
    $class = get_class($object);
    $primaryKey = $class::persistentPrimaryKey;
    
    if (is_array($primaryKey))
    {
      /* TODO */
    }
    $result = $this->select($class::persistentTable, null, array($primaryKey => $object->$primaryKey));
    if (0 == count($result))
    {
      return null;
    }
    
    $row = $result[0];
    $object->map($row);
    
    return $object;
  }
}