programing

라벨 마이그레이션 파일에 열이 있는지 확인

javamemo 2023. 8. 13. 09:02
반응형

라벨 마이그레이션 파일에 열이 있는지 확인

이미 테이블 이름이 있습니다.table_one.이제 두 개의 열을 더 추가하려고 합니다.지금까지는 모든 것이 잘 작동합니다.그러나 내 방법에서는 다음과 같은 열이 내 테이블에 있는지 확인하고 싶습니다.dropIfExists('table').

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('table_one', function (Blueprint $table) {
        $table->string('column_one')->nullable();
        $table->string('column_two')->nullable();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('table_one', function (Blueprint $table) {
        // in here i want to check column_one and column_two exists or not
        $table->dropColumn('column_one');
        $table->dropColumn('column_two');
    });
}

당신은 이것과 같은 것이 필요합니다.

  public function down()
    {
        if (Schema::hasColumn('users', 'phone'))
        {
            Schema::table('users', function (Blueprint $table)
            {
                $table->dropColumn('phone');
            });
        }
    }

열 존재 여부를 확인하는 고유한 'dropColumnIfExists()' 함수를 만든 다음 삭제할 수 있습니다.

function myDropColumnIfExists($myTable, $column)
{
    if (Schema::hasColumn($myTable, $column)) //check the column
    {
        Schema::table($myTable, function (Blueprint $table)
        {
            $table->dropColumn($column); //drop it
        });
    }

}

다음과 같이 'down()' 기능에 사용합니다.

public function down()
{
    myDropColumnIfExists('table_one', 'column_two');
    myDropColumnIfExists('table_one', 'column_one');
}

만약 당신이 정말로 그것을 안에 원한다면.Schema::table마지막으로, 그것은 그것을 하는 유일한 깔끔한 방법입니다.당신은 두 가지 방법을 추가해야 할 것입니다.Blueprint아니면 이 보일러 플레이트를 모든 이동 중에 사용할 수도 있습니다.예쁘지는 않지만, 일단 도착하면 각각 한 줄만 사용하여 원하는 만큼의 조건부 추가 및 삭제를 정의할 수 있습니다.

return new class extends Migration {
    public function up() {

        Schema::table('tblAnimal', function (Blueprint $table) {
            $exists = function (string $column) use ($table) {
                return (Schema::hasColumn($table->getTable(), $column));
            };
            $addUnlessExists = function (string $type, string $name, array $parameters = [])
                use ($table, $exists) {
                    return $exists($name) ? null : $table->addColumn($type, $name, $parameters);
                };
            $dropIfExists = function (string $column) use ($table, $exists) {
                return $exists($column) ? $table->dropColumn($column) : null;
            };

            $dropIfExists('column_name');
            $addUnlessExists('integer', 'int_column');
            # ...
        });

테이블 열을 동적으로 확인하기 위해 다음과 같은 방법을 사용할 수 있습니다.

public function dropIfExists($table, $column)
{
    if (Schema::hasColumn($table, $column)) //check the column
    {
        Schema::table($table, function (Blueprint $table) use ($column)
        {
            $table->dropColumn($column); //drop it
        });
    }

}

다음과 같은 기능을 추가해야 합니다.

public function dropColumnIfExists($tbl,$column)
{
    if (Schema::hasColumn($tbl, $column)) {
        Schema::table($tbl, function (Blueprint $table) use ($column) {
            $table->dropColumn($column);
        });
    }
}

그리고 이와 같이 위 또는 아래 기능으로 호출합니다(위 기능으로 간주).

public function up()
{
    $tbl = 'table_name';
    Schema::table($tableName, function (Blueprint $table) use ($tbl) {
        $this->dropColumnIfExists($tbl,'your_colomn_name');
    });
}

좋은 토론!다음은 다중 DB를 지원하는 호출 가능한 접근 방식입니다.

특성을 이용해 건조하고 청결하게 유지:

namespace App\Support\Concerns;

use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;

trait HasManyConnections
{

    /**
     * Runs a migration conditionally if specified columns do not already exist
     *
     * @param string $connection
     *
     * @param string $table
     * @param mixed $columns
     * @param callable $callback
     *
     * @return void
     */
    function runIfColumnsAreNew(string $connection, string $table, $columns, callable $callback) : void
    {
        $schema = Schema::connection($connection);
        
        /*----------------------------------------------------------------------------
        | Create the table and run the migration if the table doesn't exist
        ----------------------------------------------------------------------------*/

        if(!$schema->hasTable($table)){

            $schema->create($table, function (Blueprint $table) use ($callback){

                $callback($table);
            });

            return;
        }

        /*----------------------------------------------------------------------------
        | Iterate the provided columns and determine if any exist
        ----------------------------------------------------------------------------*/

        $migratable = true;

        Collection::wrap($columns)->each(function($column) use ($schema, $table, &$migratable){

            if($migratable){

                $migratable = !$schema->hasColumn($table, $column);
            }
        });

        /*----------------------------------------------------------------------------
        | Update the table if all columns are new
        ----------------------------------------------------------------------------*/

        if ($migratable) {

            $schema->table($table, function (Blueprint $table) use ($callback){

                $callback($table);
            });
        }
    }
}

이제 우리는 그것을 마치 우리의 논리를 종결로 전달하는 표준적인 마이그레이션처럼 취급합니다.

use App\Support\Concerns\HasManyConnections;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    use HasManyConnections;

    /**
     * Run the migrations.
     */
    public function up(): void
    {
        $this->runIfColumnsAreNew('accounts_db', 'profiles', 'squad_name', function(Blueprint $table){
           
            $table->string('squad_name')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        //
    }
};

도움이 되길 바랍니다!

스키마를 두 개의 호출로 나눕니다.

public function up()
{
    Schema::table('table_one', function (Blueprint $table) {
        $table->dropColumn(['column_one', 'column_two']);
    });

    Schema::table('table_one', function (Blueprint $table) {
        $table->string('column_one')->nullable();
        $table->string('column_two')->nullable();
    });
}

언급URL : https://stackoverflow.com/questions/54176290/check-if-a-column-exists-in-laravel-migration-file

반응형