Я использую Propel ORM, чтобы упростить загрузку и сохранение довольно большой формы в базе данных. Форма огромная, но в целом это плоские данные, так что это по сути одна большая таблица (назовем ее персонами) с парой сотен столбцов. Я не хочу, чтобы в одной таблице было несколько сотен столбцов, поэтому у меня есть одна основная таблица и несколько подстолбцов.
Я использую поведение делегата, описанное Вот. Это хорошо, потому что я могу позвонить PersonQuery::create()->findPK($id)->toArray()
и это дает мне не только данные в Персоне, но и данные в каждой вложенной таблице. Затем я могу очень легко загрузить эти данные в мою форму.
Когда пользователь редактирует форму и отправляет ее, я отправляю данные формы на сервер, используя POST. Затем я перебираю эти данные POST, чтобы присвоить их объекту person, и использую «setByName
«сделать это вместо конкретных функций, которые предоставляет Propel. Поэтому вместо этого:
$person = PersonQuery::create()->findPK($id);
$person->setAge($_POST['age']);
$person->setName($_POST['name']);
//repeat for hundreds of columns
Я могу просто сделать это:
$person = PersonQuery::create()->findPK($id);
foreach($_POST as $field=>$value){
//before you ask, yes, i validate $field here
$person->setByName($field, $value);
}
Проблема в том, что это не работает для моих таблиц делегатов. Так что, если у меня есть моя главная таблица как Персона, и у меня есть таблица делегатов под названием Избранное, с полем Цвет, я могу сделать $person->setColor('Blue')
, но я не могу сделать $person->setByName('Color','Blue')
,
Итак … я могу сделать что-то подобное или что-то подобное? Я действительно не хочу выписывать сеттер для каждого столбца и должен обновлять этот список сеттеров всякий раз, когда я меняю базу данных. Спасибо!
Возможно, вы могли бы искать поля.
$lookup = array('color' => 'setColor');
foreach ($_POST as $fieldName => $fieldValue) {
if (isset($lookup[$fieldName])) {
$func = $lookup[$fieldName];
$person->$func($fieldValue);
}
}
Вам не нужен массив поиска, ваша функция может быть объединением ‘set’ и ucwords ($ fieldName) = setColor
Я не рекомендую это, поскольку это может быть небезопасно без поиска.
Других решений пока нет …