繁体   English   中英

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

[英]What is the best way to update or retrieve rows in database?

我参考了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类的属性时,我想要这样的输出

[{
    "site_title"    : "Title",
    "site_url"      : "http://localhost",
    "site_admin"    : "local@host"
}]
$output = array();
foreach ($settings as $setting) {
 $output[] = array($setting['setting_name'] => $setting['setting_value']);
}
return json_encode($output);

您在使用EAV数据库结构时遇到了基本问题(尽管您可能更准确地将其描述为行建模) http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

这种类型的数据结构永远都不容易查询或更新,我建议您删除它,而只为每个配置变量创建一个带有列的配置表。 在某个时候,您将定义所需的所有设置,以便可以为它们构建表。 如果以后要添加其他配置设置,则只需将列添加到表中。

就是说,如果您坚持使用EAV,那么让您的代码将结果转换为更有用的东西:

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

$title = $config->site_title;

希望该示例对您有所帮助,但是我用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问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM