[英]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.