Propel ORM — использование setByName для столбца из делегированной таблицы

Я использую 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'),

Итак … я могу сделать что-то подобное или что-то подобное? Я действительно не хочу выписывать сеттер для каждого столбца и должен обновлять этот список сеттеров всякий раз, когда я меняю базу данных. Спасибо!

0

Решение

Возможно, вы могли бы искать поля.

$lookup = array('color' => 'setColor');

foreach ($_POST as $fieldName => $fieldValue) {
if (isset($lookup[$fieldName])) {
$func = $lookup[$fieldName];
$person->$func($fieldValue);
}
}

Вам не нужен массив поиска, ваша функция может быть объединением ‘set’ и ucwords ($ fieldName) = setColor

Я не рекомендую это, поскольку это может быть небезопасно без поиска.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]