Как сохранить array () в свойстве RedBean? - PullRequest
4 голосов
/ 22 декабря 2011

Я получил следующее:

$post = (array) json_decode($post);
$pushUser->dagen = (array) $post['days'];

Часть «дней» поста:

[dagen] => Array
    (
        [0] => Monday
        [1] => Wednesday 
    )

Все, что я хочу сделать, это сохранить в $ pushUser-dagen массивс days:) ... довольно просто, да?

Но тогда я получаю следующие ошибки:

исключение 'RedBean_Exception_Security' с сообщением 'Invalid Bean: свойство dagen' в E: \Документация \ 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-> check (Object (RedBean_OODBBean)) # 1 E: \ Documenten \ Dropbox \ Dropbox \ dummy-htdocs \ VID_service \ vid_push \ libs \ rb.php (7376): RedBean_OODB-> store (объект (RedBean))# 2 E: \ Documenten \ Dropbox \ Dropbox \ dummy-htdocs \ VID_service \ vid_push \ api \ registerpush.php (32): R :: store (Object (RedBean_OODBBean)) # 3 {main}

Разве невозможно хранить массивы в объекте RedBean?

Ответы [ 3 ]

3 голосов
/ 30 сентября 2012

http://redbeanphp.com/community/wiki/index.php/Tutorial#Loading_A_Bean

Выезд import().Вы должны отформатировать свои массивы для хранения пары ключ / значение в виде столбца / строки и т. Д.

$bean->import($array);

$bean->import($array, "key1,key4");

и так далее.Вы всегда можете использовать функции поиска по массиву или регулярному выражению, чтобы найти свое значение или отформатировать массив так, чтобы Redbean понимал, где Array - это ключ / значение, а ключ должен следовать определенным правилам, которые определены в функции check () в redbean, я могуНе забывайте мне в голову, просто откройте rb.php и найдите «public function check (»), и вы должны его найти, но последнее условие - это то, что вы должны выполнить абсолютно.

$pattern = '/[^a-z0-9_]/i';

itне должен быть массивом или объектом, а свойство должно быть строкой> strlen of 2, в противном случае оно выдаст недопустимый bean-компонент: свойство ..... исключение. Это должен быть плоский массив ключ = значение, и вы можетелегко импортировать.

Надеюсь, это поможет.

3 голосов
/ 29 декабря 2011

Нет способа хранить массивы в bean-компонентах, потому что 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)); 

В этом случае вы можете найти каждого пользователя, у которого есть «понедельник» и «суббота», запросив: days = 33. Это действительно быстро.

Если вам не нужны данные, вы можете использовать:

//Quick and dirty solution
$user->days = implode(',',$days);
1 голос
/ 18 июня 2013

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

...