CREATE TABLE `city` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(256) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`(255))
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(256) DEFAULT NULL,
`city` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`(255)),
KEY `city` (`city`),
CONSTRAINT `city` FOREIGN KEY (`city`) REFERENCES `city` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
$db = new PDO($dsn, 'dev', null);
$query = <<<SQL
SELECT city.id as city_id, city.name as city_name, user.id as user_id, user.name as user_name
FROM user
JOIN city ON user.city = city.id
SQL;
$query = $db->prepare($query);
$query->execute();
$obj = $query->fetch(PDO::FETCH_ASSOC);
var_dump($obj);
class User
{
private $id;
private $name;
private $city;
public function getCity()
{
return $this->city;
}
public function setCity(City $city)
{
$this->city = $city;
}
public function getId()
{
return $this->id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
class City
{
private $id;
private $name;
public function getId()
{
return $this->id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
Не, как отфильтровать я понимаю, как приватным полям установить значения без рефлексии? Или FetchObject как раз рефлексию юзает?у тебя уже всё готово, по префиксу рассовывай по объектам.
city_ -> City
user_ -> User
p.s. Я делаю два запроса с кешем.
Это вещь субъективная http://habrahabr.ru/post/184160/А какой смысл делать два запроса? Так делает доктрина по умолчанию с ее lazy loading, но ведь 1 запрос лучше, чем 2?
id-шник тоже через сеттер?)hell0w0rd
Так и эзай сеттеры, зачем приватные поля заполнять напрямую.
Это вещь субъективная http://habrahabr.ru/post/184160/
Так если есть datamapper в том или ином виде, вытянув сразу два объекта, они кешироваться по одиночке будут?)FetchObject использует внутреннее php api. Он вообще до вызова конструктора.
2 запроса лучше, чем 1, если это повышает cache hit/miss ratio.
Ну вот fixxxer когда предложил про unserialize, я подумал что можно например делать подготовленную строку и в нее запихивать аргументы sprintfом напримерhell0w0rd
рефлексия, внешние xml, либо in-code правила для распределения результата по объектам. Пока что ничего особо нового не придумали.
это называется AR.entities - все те же строки таблиц в php, а таблицы - те же наборы php-объектов
Хм, AR - это всего лишь паттерн, в котором все entities наследуются от класса, умеющего сохраняться в бд самостоятельно.это называется AR.
есть ORM вида хибернейт, там могут быть embedded values. ORM рассчитанная на entities старается максимально соблюдать PI, отсюда и куча проблем. Ты решай лучше доктриной, а не пиши свою ORM![]()
видишь как у тебя все простоХм, AR - это всего лишь паттерн, в котором все entities наследуются от класса, умеющего сохраняться в бд самостоятельно.
А datamapper - класс, знающий откуда взять объект и как сохранить объекты, которые ничего не знают о базе, в этом и все различие