更新或检索数据库中的行的最佳方法是什么?

时间:2015-03-11 03:47:11

标签: php mysql laravel

我参考了Wordpress的数据库,为Laravel中的应用程序创建配置设置。我创建了一个app_settings表,其中idsetting_namesetting_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"
}]

3 个答案:

答案 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