[英]What is the best way to update or retrieve rows in database?
我参考了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
类的属性时,我想要这样的输出
[{
"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.