コード例 #1
0
 /**
  * Retorna dados pela chave primária.
  * Se a chave primária é composta, há duas opções:
  *        1. Fornecer os valores correspondentes na ordem que os campos aparecem na tabela:
  *            $table->getById(array(1, 'foo'));
  *        2. Fornecer um conjunto de chaves/valores com o nome dos campos>
  *            $table->getById(array(
  *                 'campo2' => 'foo',
  *                'campo1' => 1
  *            ));
  *
  * @param mixed $id : o valor da chave primária do registro desejado
  * @return Row|null
  */
 public function getById($id)
 {
     $this->setupPrimaryKey();
     $id = (array) $id;
     if (($countId = count($id)) != ($countPk = count($this->primaryKey))) {
         throw new Exception("A tabela {$this->name} possui {$countPk} campos em sua chave primária.\n                O número de campos fornecidos para a busca foi {$countId}!");
     }
     $sql = 'SELECT * FROM ' . $this->getName() . ' WHERE ';
     $fields = array();
     // Caso 1
     if (is_numeric(key($id))) {
         // Precisamos disso porque $this->primaryKey é um array 1-based
         foreach ($this->primaryKey as $col) {
             $fields[] = $col . ' =  ?';
         }
     } else {
         $keys = array_keys($id);
         $diff = array_diff($this->primaryKey, $keys);
         if (!empty($diff)) {
             $pkStr = join(', ', $this->primaryKey);
             $keysStr = join(', ', $keys);
             throw new Exception("A tabela {$this->name} tem chave primária composta pelos campos\n                    {$pkStr}. Os seguintes campos foram fornecidos: {$keysStr}");
         }
         foreach ($keys as $col) {
             $fields[] = $col . ' = ?';
         }
     }
     $sql .= join(' AND ', $fields);
     $this->driver->query($sql, array_values($id));
     $data = $this->driver->fetchOne();
     if ($data !== null) {
         return $this->doCreateRow($data, true);
     } else {
         return null;
     }
 }