![](/img/trans.png)
[英]What's the best way to retrieve data from a database and pass it as variables
[英]What's the best way to refactor a database and its data? (Laravel 5.2)
我試圖弄清楚如何處理Laravel 5.2中遷移中的結構性數據以及與數據相關的更改。 目前,我只是在對數據庫進行結構更改后更改了現有數據。 但這似乎與版本控制代碼相沖突。
列owner_id
應該添加到teams
表中。 簡單遷移,沒問題。 之后,所有現有團隊都應獲得此ID。 因此,我也將其放在遷移中:
foreach ($teams as $team) {
// get the first user of this team over a many-to-many-relationship-table `team_user`
$team->owner_id = $team->users->first()->id;
...
}
乍一看效果很好。
經過幾天的提交,我決定在上述關系表中添加一個透視列role
。 我添加了遷移,並在團隊模型中輸入了以下內容:
public function users() {
return $this->belongsToMany(...)->withPivot('role');
}
如果現在我要完全刷新本地數據庫,則在第一次遷移時會出現錯誤。 那是因為它調用了$ team-> users,但是在此數據庫狀態下,該role
尚不可用,因此方法調用失敗。 這就像版本控制和數據庫遷移之間的轉變。
有一個干凈的解決方案嗎?
預先感謝,理查德
通常,遷移是DDL(數據定義語言),而種子是DML(數據操作語言)。
遷移數據庫表是有序的。 您不能添加依賴於某些DDL的代碼,這些代碼可以在運行那些DDL之前執行。
您還需要考慮的另一件事是:遷移不是進行數據播種,修改和操作的地方,因為播種可能需要在開始播種之前完成所有數據定義。 這就是Laravel具有數據種子的原因。
因此,播種,修復或更改數據之間沒有區別,全都是DML。 您可以在遷移中做到這一點,這不是禁止的,但是在那些遷移中,您必須非常小心,要撤消(上移) up
方法中的每個步驟。 但是有時候很難操作回您的數據 。
您的問題是您試圖通過關系訪問某些數據,而這些數據尚未准備好(或已完成,或已播種),因為可以遷移的數據尚未運行。 因此,DDL和DML之間存在沖突,如果將它們分開處理,則不會發生沖突。
通常,數據播種僅用於測試,但是如果您確實需要,可以在播種器中執行以下操作:
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
if (app()->environment('testing')) {
$this->call(TestingSeeders::class);
}
$this->call(ProductionReadySeeders::class);
}
}
或者,您可以只創建一個命令來播種數據:
Artisan::command('app:seed', function ($email)
{
// Do whatever you need to seed your database tables
});
並與
php artisan app:seed
如果要確保每個人都獲得了新版本(如果您的應用程序也獲得了正確的數據),則可以使用Composer后期執行命令來這樣做:
"post-install-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postInstall",
"php artisan optimize",
"php artisan migrate --force",
"php artisan app:seed"
],
"post-update-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postUpdate",
"php artisan optimize",
"php artisan migrate --force",
"php artisan app:seed"
]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.