2016-06-16 3 views
0

Что я пытаюсь сделать, так это оптимизировать способ хранения данных в моей таблице wp_postmeta.Обновление meta_value, добавляющего ассоциативный массив к тем, которые уже существуют

мне нужно сохранить несколько отношений между столбами, и моя стартовая ситуация была просто:

add_post_meta($parent_id, 'post_child', $child_id); 

Таким образом мне нужно использовать строку базы данных для каждого отношения.

Учитывая, что один и тот же родитель может быть связан с несколькими детьми, я пытался понять, что может быть хорошей конфигурацией массива, и я получил что-то вроде этого (но я все еще не уверен, что это лучший способ):

array(
    array(
     parent => 121, 
     child => 122 
    ), 
    array(
     parent => 121, 
     child => 122 
    ), 
    array(
     parent => 121, 
     child => 123 
    ), 
    ... 
); 

Затем я попытался с этим кодом:

if ($post_relations = get_post_meta($book_id, 'post_relations', true)) { 

    $post_relations[] = array("parent" => $parent_id, "child" => $child_id); 

    update_post_meta($book_id, 'post_relations', $post_relations); 

} else { 

    $post_relations[] = array("parent" => $parent_id, "child" => $child_id); 

    add_post_meta($book_id, 'post_relations', $post_relations); 

} 

но в результате я получаю в meta_value поле, кажется, отличается от результата я ожидал:

a:2:{ 
i:0;a:2:{s:6:"parent";i:1;s:5:"child";i:510;}i:1;a:2:{s:6:"parent";i:510;s:5:"child";i:511;} 
} 
+0

Вы не показываете код для 'update_post_meta' или' add_post_meta', которые кажутся проблематичными функциями. –

+0

Я не понимаю, что вы имеете в виду, это функции Wordpress ... Какой код мне следует показывать? – supadema

+0

Извините, я не эксперт Wordpress. Я просмотрел документацию [add_post_meta] (https://codex.wordpress.org/Function_Reference/add_post_meta). Кажется, вы это правильно называете. Результат, который вы показываете, кажется, имеет родителя с id из 1 и дочернего с идентификатором 510, затем другого родителя с идентификатором 510 и дочернего с идентификатором 511. Может быть, вы должны добавить свой ожидаемый результат к своему вопросу? –

ответ

0

Функции WordPress update_post_meta() и add_post_meta() оба требуют сериализуемых данных;

update_post_meta (int $post_id, string $meta_key, mixed $meta_value, mixed $prev_value = '')

$meta_value Должно быть сериализации, если нескалярный

update_post_meta()

Похоже, это в базе данных, поскольку эти функции serialize() массива вы передаете его.

Следовательно, если вы обращались к данным за пределами функции get_post_meta(), вы должны были бы получить данные unserialize().

0

Я думаю, вы должны сохранить отношения как одно отношение к одному сообщению мета - сохранение отношений в массиве очень затруднит выполнение запросов к БД.

Итак, сохраните свои отношения как ie post_relations_0, post_relations_1 и т. Д., Или, что еще лучше, если вы планируете выполнять некоторые запросы, сохраните отношения в отдельной таблице.

+0

Сохранение отношений как одно отношение к одному сообщению meta Я думаю, это было бы самым простым решением, потому что это то, что я уже делаю, и отлично работает для меня. Мое единственное беспокойство заключается в том, что, если у меня будет действительно большое количество отношений, чтобы сохранить, что, наконец, лучшее решение для повышения производительности?Много строк db, которые содержат одно значение или меньше строк db, которые содержат большой массив значений? – supadema

+1

Как сказано, запрос значений в массиве будет затруднен - ​​ваш лучший выбор - одна строка на один элемент. Я бы пошел с отдельной таблицей с идентификаторами столбцов, parent_id, child_id. Таким образом, вы можете легко запросить все, что вам нужно. – user1049961

Смежные вопросы