我們的資料庫包含有關企業/服務提供商使用的語言的資訊,我們有一個“雙語”部分,但我們需要將其更改為兩個單獨的專案:“英語”和“西班牙語”。資料庫結構為關系表:
| 桌子 | 商業 |
|---|---|
| 整數 | ID |
| varchar | 企業名稱 |
| 桌子 | 商業語言 |
|---|---|
| 整數 (FK) | 業務編號 |
| 整數 (FK) | 語言標識 |
| 桌子 | 語言 |
|---|---|
| 整數 | ID |
| varchar | 語言名 |
我們使用 Laravel 作為 Web 應用程式的后端,所以如果我們要查詢資料庫并獲取語言,它會如下所示:
$business = Business::all();
foreach($business as $b) {
//gives us a collection of languages
$b->language();
}
我想要做的是撰寫一個一次性 SQL 查詢,查找具有“雙語”作為語言的企業的所有實體,添加“英語”和“西班牙語”作為語言(如果它不存在),并洗掉“雙語”。
這樣的一次性查詢是否可行,還是我必須為每項業務撰寫一個腳本來為我做這件事?
uj5u.com熱心網友回復:
對于這個特定的例子,有一個簡單的解決方案:
$businesses = Business::with('languages')->get();
$english_id = Language::where('language_name','English')->first()->id;
$spanish_id = Language::where('language_name','Spanish')->first()->id;
$bilingual_id = Language::where('language_name','Bilingual')->first()->id;
foreach($businesses as $business) {
$is_bilingual = $business->languages->where('id', $bilingual_id)->first();
if($is_bilingual) {
$business->languages()->sync([$english_id,$spanish_id]);
}
}
uj5u.com熱心網友回復:
試試這個。
$business = Business::all();
$language_models = Languages::all();
$english_id = $language_models->find(function($language) {
return $language->name() == 'English';
})->pluck('id');
$spanish_id = $language_models->find(function($language) {
return $language->name() == 'Spanish';
})->pluck('id');
$bilingual_id = $language_models->find(function($language) {
return $language->name() == 'Bilingual';
})->pluck('id');
foreach($business as $b) use($english_id, $spanish_id, $bilingual_id) {
$languages = $b->language()->map(function($language) {
return $language->name();
});
if (in_array('Bilingual', $languages) {
if (!in_array('English', $languages)) {
$b->language()->attach($english_id);
}
if (!in_array('Spanish', $languages)) {
$b->language()->attach($spanish_id);
}
$b->language()->detach($bilingual_id);
}
}
我寫了這里發生的事情,但它非常不言自明。
您將需要在您的語言模型上有一個名稱方法或更改代碼以匹配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/425340.html
