Как сохранить массив() в свойстве 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?

Author: Highmastdon, 2011-12-22

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);
 3
Author: Gabor de Mooij, 2011-12-29 13:26:28

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, иначе оно выдаст недопустимый компонент: свойство..... исключение. Это должен быть плоский массив ключ=значение, и вы можете легко импортировать его.

Я надеюсь, что это поможет.

 3
Author: Hash Borgiir, 2012-10-02 07:45:00

Одним из решений является сериализация массива с помощью сериализации ($array) перед сохранением его в компоненте и десериализация ($array) при его извлечении.

 1
Author: Or Arbel, 2013-06-18 15:32:59