我参考了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": "local@host.com",
"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" : "local@host"
}]
答案 0 :(得分:0)
$output = array();
foreach ($settings as $setting) {
$output[] = array($setting['setting_name'] => $setting['setting_value']);
}
return json_encode($output);
答案 1 :(得分:0)
您遇到了使用EAV数据库结构的基本问题(尽管您可能会将其更精确地描述为行建模)http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model
这种类型的数据结构永远不容易查询或更新,我建议您删除它,只需为每个config var创建一个包含列的配置表。在某些时候,您将定义所需的所有设置,以便为它们构建表。如果您以后想要添加另一个配置设置,那么只需将该列添加到表中即可。
那就是说,如果你坚持使用EAV,那么让你的代码将结果转换成更有用的东西:
$config = new \stdClass;
foreach($result as $row){
$config->$row['setting_name'] = $row['setting_value'];
}
$title = $config->site_title;
答案 2 :(得分: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