라벨 마이그레이션 파일에 열이 있는지 확인
이미 테이블 이름이 있습니다.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
'programing' 카테고리의 다른 글
Jquery 날짜 선택기 z 인덱스 문제 (0) | 2023.08.13 |
---|---|
PowerShell로 빈 하위 폴더를 삭제하는 방법은 무엇입니까? (0) | 2023.08.13 |
"dial unix /var/run/docker"를 수정하는 방법.sock: connect: permission denied" 그룹 권한이 올바른 것처럼 보일 때? (0) | 2023.08.13 |
ASP.net 보다 Classic ASP의 이점이 있습니까? (0) | 2023.08.13 |
PowerShell로 파일의 특정 줄을 인쇄하는 방법은 무엇입니까? (0) | 2023.08.13 |