2013-07-01 3 views
1

Так что в настоящее время у меня есть класс DailyRecord для таблицы в моей базе данных daily_record. Предположим, что у него есть поля с именем id, field1 и field2. В моем конструкторе я передаю идентификатор записи и запрашиваю базу данных для извлечения всех трех полей. Я хочу, чтобы мой класс имел данные, которые заполнены из этого запроса. Тем не менее, я буду делать это с большим количеством таблиц и классов, и я стараюсь, чтобы избежать чего-то вроде этого:PHP Аннотация класс для заполнения класса из таблицы базы данных

public __construct($id){ 
    //$record = $db->query('some query here'); 

    $this->id = $record['id']; 
    $this->field1 = $record['field1']; 
    $this->field2 = $record['field2']; 
} 

Потому что, если у меня есть много полей в таблице это будет получить довольно утомительно. Кроме того, мне может не понадобиться заполнять все поля каждый раз, когда я создаю класс (если я использую несколько конструкторов). Мне показалось, что я помню, как видел CMS электронной коммерции (Prestashop или Magento), который создал для этого абстрактный класс. Так или иначе, расширив этот абстрактный класс, можно было автоматически заполнить эти поля.

Есть ли у кого-нибудь предложения по поводу чего-то подобного? Заранее спасибо!

+1

Как правило, вы не должны запрашивать БД внутри CTOR. Что делать, если есть исключение? Что делать, если база данных закрыта? и т. д. Что делать, если ваш источник данных изменяется? Используйте интерфейс для определения того, как класс взаимодействует с каким-либо неоднозначным источником данных, а затем зависимость вставляет экземпляр этого интерфейса в метод 'load'. – crush

+0

Хорошая точка. Поэтому, даже если я переведу этот запрос за пределы ctor, я бы хотел найти способ автоматического заполнения полей. –

+0

Вы можете начать с использования 'DESCRIBE tableName', чтобы получить всю необходимую информацию в полях и типах полей для MySQL и' sp_columns' для MSSQL и т. Д. – dbf

ответ

1
public __construct($id){ 
    $record = SOME_DATASTORAGE_CONTAINER->query('some query here'); 
    foreach($record as $k=>$v){ 
     $this->$k = $v; 
    } 
} 

Вы можете также read о PDO::FETCH_CLASS способ Выборка данных

+0

Разве 'PDO :: FETCH_CLASS' не требует, чтобы поля были общедоступными, или нет? – crush

+0

они будут публичными, и вам не нужно их определять. PHP не идеален ;-) –

+0

Итак, PHP создаст элементы, если они не существуют? – crush

Смежные вопросы