如何使用自定义方法 $ table-> myMethod()扩展 Laravel 5.5 / 5.6 MySQL蓝图,例如预先构建的方法 $ table->时间戳(); ?
我尝试过使用SQLlite的示例:Extending Blueprint for SQLite in Laravel 5
但我无法让它发挥作用。我正在开发自己的包(使用包开发最佳实践),并希望从那里包含Blueprint扩展。
我的开发包有Laravel扩展文件夹“Extension”: 的 ./包/ VENDORNAME /包/ SRC /扩展/
有文件:
1) ./ packages / vendorname / packagename / src / Extension / Blueprint.php
=ROWS($1:1)-1
2) ./ packages / vendorname / packagename / src / Extension / MySqlConnection.php
<?php
namespace Vendorname\Packagename\Extension;
use Illuminate\Database\Schema\Blueprint as ParentBlueprint;
use Illuminate\Support\Facades\DB;
class Blueprint extends ParentBlueprint
{
public function myMethod()
{
$this->text('custom_column')->default('Some value');
$this->text('custom_column2')->default('Some value2');
}
}
我的包裹有服务提供者: 使用 register()方法 ./ packages / vendorname / packagename / src / VendornamePackagenameServiceProvider.php :
<?php
namespace Vendorname\Packagename\Extension;
use Vendorname\Packagename\Extension\Blueprint;
use Illuminate\Database\MySqlConnection as ParentMySqlConnection;
use Illuminate\Database\Schema\MySqlBuilder;
class MySqlConnection extends ParentMySqlConnection
{
public function getSchemaBuilder()
{
if (is_null($this->schemaGrammar)) {
$this->useDefaultSchemaGrammar();
}
$builder = new MySqlBuilder($this);
$builder->blueprintResolver(function ($table, $callback) {
return new Blueprint($table, $callback);
});
return $builder;
}
}
我的包也有迁移文件: 的 ./包/香草/香草管理员/ SRC /迁移/ 2018_02_07_213437_create_logs_table.php :
public function register()
{ if ($this->app->config->get('vendorname-packagename') === null) {
$this->app->config->set('vendorname-packagename', require __DIR__.'/../config/vendorname-packagename');
}
$this->app->bind('db.connection.mysql', Vendorname\Packagename\Extension\MySqlConnection::class);
}
如何使用标准“使用Illuminate \ Database \ Schema \ Blueprint;”在迁移中,因为我不想使用“使用Vendorname \ Packagename \ Extension \ Blueprint;”。
我在运行迁移时遇到错误“php artisan migrate:refresh”:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
//use Vendorname\Packagename\Extension\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateLogsTable extends Migration
{
public function up()
{
Schema::create('logs', function (Blueprint $table) {
$table->increments('id');
$table->text('package');
$table->longText('log');
$table->myMethod();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('logs');
}
}
请帮我找一个解决方案。我在互联网上搜索并整天测试,我无法让它工作:(
答案 0 :(得分:1)
使用Laravel 5.5,扩展蓝图的最佳方法是在AppServiceProvider
引导方法中注册macros,如下所示:
Blueprint::macro('yourmethod', function () {
// your method here
});
答案 1 :(得分:1)
我遇到了同样的问题,并通过创建一个新的 CustomBlueprint 类解决了该问题。我为此写了一个单独的博客。只要去那里,您就会找到答案。 在这里,我仅给出一个迁移文件示例,该文件具有commonFields()方法以在模型中添加公共字段
$schema = DB::connection()->getSchemaBuilder();
$schema->blueprintResolver(function ($table, $callback) {
return new CustomBlueprint($table, $callback);
});
$schema->create('roles', function (CustomBlueprint $table) {
$table->bigIncrements('id');
$table->string('name')->unique();
$table->commonFields();
});
我创建了具有该方法的CustomBlueprint类。
<?php
namespace App\common;
use Illuminate\Database\Schema\Blueprint;
class CustomBlueprint extends Blueprint
{
public function commonFields()
{
$this->timestamp('created_at')->nullable();;
$this->unsignedBigInteger('created_by')->nullable();
$this->timestamp('updated_at')->nullable();;
$this->unsignedBigInteger('updated_by')->nullable();
$this->timestamp('deleted_at')->nullable();;
$this->unsignedBigInteger('deleted_by')->nullable();
$this->boolean('is_deleted')->default(0);
}
}
答案 2 :(得分:0)
只需在迁移中使用它:
public function up()
{
$schema = \DB::getSchemaBuilder();
$schema->blueprintResolver(function($table, $callback) {
return new YourBlueprint($table, $callback);
});
$schema->create('table_name', function (YourBlueprint $table) {
...
答案 3 :(得分:0)
我在搜索同一问题时发现了这一点。我正在使用Laravel 5.8并采用这种方式。
namespace App\Database\Schema;
class Blueprint extends \Illuminate\Database\Schema\Blueprint
{
public function datetimeCreatedAt($precision = 0)
{
return $this->dateTime('created_at', $precision);
}
}
namespace App\Database;
class MySqlConnection extends \Illuminate\Database\MySqlConnection
{
public function getSchemaBuilder()
{
$builder = parent::getSchemaBuilder();
$builder->blueprintResolver(function ($table, $callback) {
return new \App\Database\Schema\Blueprint($table, $callback);
});
return $builder;
}
}
namespace App\Providers;
use App\Database\MySqlConnection;
use Illuminate\Database\Connection;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
Connection::resolverFor('mysql', function ($connection, $database, $prefix, $config) {
return new MySqlConnection($connection, $database, $prefix, $config);
});
}
}