<?php
namespace queasy\db;
use PDO;
use ArrayAccess;
use Psr\Log\NullLogger;
use Psr\Log\LoggerInterface;
use Psr\Log\LoggerAwareInterface;
use queasy\db\query\CountQuery;
use queasy\db\query\SelectQuery;
class Field implements ArrayAccess, LoggerAwareInterface
{
protected $pdo;
protected $table;
protected $name;
protected $logger;
public function __construct(PDO $pdo, Table $table, $name)
{
$this->logger = new NullLogger();
$this->pdo = $pdo;
$this->table = $table;
$this->name = $name;
}
public function update($offset, $value, array $options = array())
{
if (null === $value) {
return $this->delete($offset);
}
return $this->table->update($value, $this->name, $offset, $options);
}
public function delete($offset, array $options = array())
{
return $this->table->delete($this->name, $offset, $options);
}
public function select($value, array $options = array())
{
$query = new SelectQuery($this->pdo, $this->table->getName());
$query->setLogger($this->logger);
$statement = $query(array($this->name => $value), $options);
return $statement->fetchAll();
}
public function offsetExists($offset)
{
$query = new CountQuery($this->pdo, $this->table->getName());
$query->setLogger($this->logger);
$statement = $query(array($this->name => $offset));
$row = $statement->fetch();
$count = array_shift($row);
return $count > 0;
}
public function offsetGet($offset)
{
$rows = $this->select($offset);
if (is_array($offset)) {
return $rows;
} else {
return array_shift($rows);
}
}
public function offsetSet($offset, $value)
{
$this->update($offset, $value);
}
public function offsetUnset($offset)
{
$this->delete($offset);
}
public function __invoke($value, array $options = array())
{
return $this->select([$value], $options);
}
public function setLogger(LoggerInterface $logger)
{
$this->logger = $logger;
}
}
|