簡體   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