Как сохранить массив() в свойстве RedBean?
Я получил следующее:
$post = (array) json_decode($post);
$pushUser->dagen = (array) $post['days'];
Часть сообщения "дни" такова:
[dagen] => Array
(
[0] => Monday
[1] => Wednesday
)
Все, что я хочу сделать, это сохранить в $PUSHUSER-dagen массив с днями:)... довольно просто, да?
Но затем я получаю следующие ошибки:
Исключение "Redbean_exception_security" с сообщением "Недопустимый компонент: свойство dagen" в E:\Documenten\Dropbox\Dropbox\dummy-htdocs\VID_service\vid_push\libs\rb.php:3465 Трассировка стека: #0 E:\Documenten\Dropbox\Dropbox\dummy-htdocs\VID_service\vid_push\libs\rb.php (3496): redbean_oodb->проверить(Объект(redbean_oodbbean)) # 1 E:\Documenten\Dropbox\Dropbox\dummy-htdocs\VID_service\vid_push\libs\rb.php (7376): redbean_oodb->магазин(Объект(redbean_oodbbean)) # 2 E:\Documenten\Dropbox\Dropbox\dummy-htdocs\VID_service\vid_push\api\registerpush.php (32):R::хранить(объект(redbean_oodbbean)) #3 {главная}
Разве невозможно хранить массивы в объекте RedBean?
3 answers
Невозможно хранить массивы в компонентах, потому что RedBeanPHP не может предсказать, как вы хотите, чтобы массив был представлен в базе данных.
Решение зависит от того, что вы хотите сделать с этой информацией позже. Вы хотите добавить что-то еще, кроме будних дней, например, вечера или сверхурочные (в случае планирования?), В этом случае я бы выбрал наиболее гибкое, но простое решение:
//Flexible solution
foreach($days as $day)
$user->sharedDay[] = R::findOne('day',' name = ? ',array($day));
Поскольку мы используем sharedDay вместо ownday, записи не будут дублироваться. Это решение создает аккуратную таблицу ссылок day_user.
Конечно, вам нужно сохранить дни недели в базе данных один раз:
$days = array('monday',...);
foreach($days as $dayname) {
$d = R::dispense('day');
$d->name = $dayname;
R::store($d);
}
Если вы хотите иметь возможность быстро отслеживать пользователя с определенным профилем дня недели, вы можете кодировать дни:
//Performance solution
function days($days) {
$weekdays = array('sunday','monday','tuesday',...);
$field = '';
foreach($weekdays as $day) {
$field .= (in_array($day,$days)) ? '1' : '0';
}
return $field;
}
$user->days = bindec(days($days));
В этом случае вы можете найти каждого пользователя, у которого есть "понедельник" и "суббота", запросив: дней = 33. Это действительно быстро.
Если вас вообще не волнуют данные, вы можете использовать:
//Quick and dirty solution
$user->days = implode(',',$days);
Http://redbeanphp.com/community/wiki/index.php/Tutorial#Loading_A_Bean
Проверьте import()
. Вам придется отформатировать массивы для хранения пары ключ/значение в виде столбца/строки и т. Д.
$bean->import($array);
$bean->import($array, "key1,key4");
И так далее. Вы всегда можете использовать функции поиска по массиву или регулярному выражению, чтобы найти свое значение или отформатировать массив таким образом, чтобы Redbean понимал, где массив является ключом/значением, а ключ должен следовать определенным правилам, которые определены в функции check() в redbean, я не могу запомни с головы до пят, просто открой rb.php и найдите "проверка публичных функций(", и вы должны ее найти, но последнее условие - это то, чему вы должны полностью соответствовать.
$pattern = '/[^a-z0-9_]/i';
Это не должен быть массив или объект, а свойство должно быть строкой > strlen 2, иначе оно выдаст недопустимый компонент: свойство..... исключение. Это должен быть плоский массив ключ=значение, и вы можете легко импортировать его.
Я надеюсь, что это поможет.
Одним из решений является сериализация массива с помощью сериализации ($array) перед сохранением его в компоненте и десериализация ($array) при его извлечении.