Хочу избавиться от портянок с именами переменных в PDO. Как?

В MySQL есть некая таблица с пользователями, если дополнительные таблицы, связанные с основной. Идея - создать класс, который будет манипулировать всеми этими таблицами. При создании объекта конструктору передаётся идентифиатор пользователя. Далее нужно извлечь данные пользователя. Логика примерно следующая:
1. $q=$pdo->prepare('SELECT ..... WHERE=?');
2. $q->ececute((array)$user_id);
3. Нужно выполнить fetch.
Если бы это делалось за пределами класса, то достаточно было использовать PDO::FETCH_CLASS. Ещё есть PDO::FETCH_OBJ. С его помощью можно получить объект со свойствами, которые неплохо было бы скопировать в свойства создаваемого объекта. Вот только как это сделать? Очень уж не хочется писать портянку из 20 свойств, что им нужно присвоить 20 значений из соответствующих полей БД.
  • Вопрос задан
  • 2348 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Alzasr
stdClass является итератором, т.е. ты можешь пробежаться по его свойствам с помощью foreach. Проверить наличие свойства у нужно объекта можно используя property_exists();
Например у тебя получился класс $classFromPDO:
$fooObj = new FooClass();
foreach($classFromPDO as $name => $value){
    if(property_exists($fooObj,$name)){
        $fooObj->{$name} = $value;
    }
}


Примерно как-то так. Кстати, тут не важно, что у тебя в $classFromPDO объект или ассоциативный массив
Ответ написан
@Arik
Пример #4 Создание объекта для каждой строки
<?php
class fruit {
    public $name;
    public $colour;
}

$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

$result = $sth->fetchAll(PDO::FETCH_CLASS, "fruit");
var_dump($result);
?>


upd:
Вот в этом то и проблема. Я пытаюсь скрыть внутри класса всё взаимодействие с БД. А у вашем варианте это не так.

Тогда надо наследовать от чего общего и ложить примерно такую логику (не тестировал, может не работать, но логика такая):
abstract class modelDB
    {
    public static function find()
        {
        $sth = $dbh->prepare("SELECT * FROM `". get_called_class() ."`");
        $sth->execute();

        return $sth->fetchAll(PDO::FETCH_CLASS, get_called_class());
        }
    }

class fruit extends modelDB {
    public $name;
    public $colour;
}

$result = fruit::find();
Ответ написан
conf
@conf
Ruby developer
Возьмите Doctrine и не мучайтесь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы