簡體   English   中英

重構數據庫及其數據的最佳方法是什么? (Laravel 5.2)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM