/** * 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; } }