2015-03-11 4 views
1

Я ссылался на базу данных Wordpress, чтобы создать настройку конфигурации для своего приложения в Laravel. Я создал таблицу app_settings с id, setting_name и setting_value в качестве столбцов для хранения каждого имени и значения конфигурации в строках. Он работает нормально, но проблема возникает всякий раз, когда я извлекаю или обновляю данные.Каков наилучший способ обновления или извлечения строк в базе данных?

$appsetting = new AppSetting(); 
return $appsetting->all(); 

Когда я запрос к базе данных он возвращает мне JSON как:

[ 
{ 
    "id": 37, 
    "setting_name": "site_name", 
    "setting_value": "Title", 
    "created_at": "2015-03-09 10:40:35", 
    "updated_at": "2015-03-11 03:23:48" 
}, 
{ 
    "id": 38, 
    "setting_name": "site_url", 
    "setting_value": "http://localhost:800", 
    "created_at": "2015-03-09 10:40:35", 
    "updated_at": "2015-03-11 03:23:48" 
}, 
{ 
    "id": 39, 
    "setting_name": "site_admin", 
    "setting_value": "[email protected]", 
    "created_at": "2015-03-09 10:40:35", 
    "updated_at": "2015-03-11 03:23:48" 
} 
] 

Случай 1:

Всякий раз, когда я должен был использовать переменную я должен был помнить индекс столбца, чтобы получить его стоимость. Например. $settings[0]['setting_value'], чтобы получить Title, и это сделает код довольно статичным, чем использование чего-то вроде $settings['site_name'].

Случай 2:

Если бы мне пришлось обновить несколько параметров сразу, мне пришлось использовать несколько команд обновления с where пункта.

$appsetting::where('setting_name', '=', 'site_name')->update(['setting_value' => $setting['title']]); 

$appsetting::where('setting_name', '=', 'site_url')->update(['setting_value' => $setting['url']]); 

$appsetting::where('setting_name', '=', 'site_admin')->update(['setting_value' => $setting['email']]); 

Каков наилучший способ обновления или извлечения строк в базе данных в этом случае?

Я хочу вывод, как это в то время, используя атрибуты, как site_title в строках

[{ 
    "site_title" : "Title", 
    "site_url"  : "http://localhost", 
    "site_admin" : "[email protected]" 
}] 
+0

Там нет никакого способа вокруг с помощью нескольких команд, чтобы обновить кучу разных записей, поскольку каждое обновление опирается на уникальную информацию rmation - имя параметра и значение для этого параметра. Вы можете создать массив с настройками и значениями и использовать цикл foreach для обновлений, это довольно просто. –

+0

@RogerHalliburton Массирование массивов было тем, чего я пытался избежать в первую очередь. Кажется, мне лучше придерживаться таблицы с колонами, чем строк, и, возможно, создать столбец типа 'settings_extras' для хранения json для часто изменяющихся атрибутов/значений. –

+0

Сохранение атрибутов/значений в json имеет серьезные недостатки, если вы когда-либо захотите запросить эту информацию.Это также не помогает с вашим отвращением к массиву, поскольку вам все еще нужно работать с массивом для генерации json, и это только ухудшается, если вы хотите добавить дополнительные настройки в будущем. –

ответ

0
$output = array(); 
foreach ($settings as $setting) { 
$output[] = array($setting['setting_name'] => $setting['setting_value']); 
} 
return json_encode($output); 
+0

Как правило, ответы гораздо полезнее, если они содержат объяснение того, что должен делать код, и почему это решает проблему, не представляя других. –

0

Вы столкнулись фундаментальной проблемой с помощью структуры базы данных EAV (хотя ваших может более acurately быть описан, как Ее моделирование) http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

Этот тип структуры данных никогда не бывает легко запросить или обновить, и я бы рекомендовал вам его удалить и просто создать таблицу конфигурации с столбцами для каждой конфигурации var. В какой-то момент вы определите все необходимые вам настройки, чтобы вы могли создать таблицу для них. Если позже вы захотите добавить другой параметр конфигурации, просто добавьте столбец в таблицу.

Тем не менее, если вы настаиваете на использование EAV то есть код преобразования результатов в нечто более полезное:

$config = new \stdClass; 
foreach($result as $row){ 
    $config->$row['setting_name'] = $row['setting_value']; 
} 

$title = $config->site_title; 
0

Я надеюсь, этот пример поможет вам, но я написал код в Doctrine DQL:

$query=$this->em->createQuery('UPDATE Alireza\Domain\Entities\Pages_modules u 
SET u.Sorder = 
    WHEN u.R THEN 'Road' 
    WHEN u.M THEN 'Mountain' 
    WHEN u.T THEN 'Touring' 
    WHEN u.S THEN 'Other sale items' 
    ELSE 'Not for sale' 
WHERE u.id IN(1,2,8,9)'); 
    Return $query->getResult(); 

этот тип запросов не n+1 problem

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