在Laravel中创建辅助函数时的约定

vc9ivgsu  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(103)

我想创建一个函数dropColumnIfExists用于laravel迁移,我在网上找到了下面的代码。

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

}

字符串
我想知道这个helper函数应该放在哪里(在类中或独立/在哪个文件中)以及如何最好地导入它。
其次,intelephense给我的错误是没有找到Schema。我应该在运行时将Schema传递给函数,还是再次遵循约定?

ezykj2lf

ezykj2lf1#

Schema Bleuprint是可宏的,这意味着你可以扩展和添加你自己的函数。
例如,您可以创建自己的服务提供商(例如:CustomSchemaServiceProvider)并注册它。
我创建了代码,并在我的本地测试它,它的工作原理与预期一样,你可以twik,因为你得到的想法;)

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CustomSchemaServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Blueprint::macro('dropColumnIfExists', function (string $column) {
            if (Schema::hasColumn($this->getTable(), $column)) //check the column
            {
                $this->dropColumn($column); //drop it
            }
        });
    }
}

字符串
现在尝试您的迁移文件:ex:

/**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('tableName', function (Blueprint $table) {
            $table->dropColumnIfExists('columnName');
        });
    }

相关问题