Uuid на сводном столе в Ларавеле - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь выполнить миграцию laravel, чтобы создать сводную таблицу.У меня есть две модели, которые определены в отношении многих ко многим.Ниже приведен метод миграции

public function up() {
    Schema::create('api_user', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('api_id')->unsigned()->index();
        $table->foreign('api_id')->references('id')->on('apis')->onDelete('cascade');

        $table->uuid('user_uid')->unsigned()->index();
        $table->foreign('user_uid')->references('uid')->on('users')->onDelete('cascade');

        $table->timestamps();
    });
}

После выполнения php artisan migrate я получил сообщение об ошибке sql

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'unsigned not null, `created_at` timestamp null, `updated_at` timestamp null) def' at line 1 (SQL: create table `api_user` (`id` int unsigned not null auto_increment primary key, `api_id` int unsigned not null, `user_uid` char(36) unsigned not null, `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')

Uuid хранится как varch в БД.Возможно, varchart не может быть установлен как неподписанный атрибут.Другой способ создания сводной таблицы из миграции, кроме Laravel-5-Generators-Extended.?

1 Ответ

0 голосов
/ 24 мая 2018

Вот как я сделал UUID:

Создание макета расширения

use Illuminate\Database\Schema\Blueprint;

class ExtendedBlueprint extends BluePrint{

    /**
     * Create a new uuid column on the table.
     *
     * @param  string  $column
     * @return \Illuminate\Support\Fluent
     */
    public function binary_uuid($column)
    {
        return $this->addColumn('buuid', $column);

    }
}

Расширение грамматики для всех языков, которые вы намереваетесь поддерживать

use Illuminate\Database\Schema\Grammars\MySqlGrammar;
use Illuminate\Support\Fluent;


class MysqlExtendedGrammar extends MySqlGrammar 
{


    protected function typeBuuid(Fluent $column)
    {
        return "varbinary(16)";
    }

}

use Illuminate\Database\Schema\Grammars\PostgresGrammar;
use Illuminate\Support\Fluent;

class PostgesExtendedGrammar extends PostgresGrammar 
{


    protected function typeBuuid(Fluent $column)
    {
        return "uuid";
    }
}

use Illuminate\Support\Fluent;
use Illuminate\Database\Schema\Grammars\SQLiteGrammar;

use Illuminate\Database\Schema\Blueprint;

class SqlLiteExtendedGrammar extends SQLiteGrammar 
{

    protected function typeBuuid(Fluent $column)
    {
        return "blob";
    }
}

use Illuminate\Support\Fluent;
use Illuminate\Database\Schema\Grammars\SqlServerGrammar;
class SqlServerExtendedGrammar extends SqlServerGrammar 
{


    protected function typeBuuid(Fluent $column)
    {
        return "uniqueidentifer";
    }
}

Затемсоздайте поставщика схемы

use Doctrine\Common\Proxy\Exception\UnexpectedValueException;
use Tschallacka\PageManager\Support\BluePrint\ExtendedBlueprint;
use Db;
use Event;

/**
 * Not so eloquent ;-)
 * @author tschallacka
 *
 */
class Stutter {

    private  $transforms = [
            'mysql'     => 'Tschallacka\PageManager\Support\Grammar\MysqlExtendedGrammar',
            'postgres'  => 'Tschallacka\PageManager\Support\Grammar\PostgesExtendedGrammar',
            'sqlite'    => 'Tschallacka\PageManager\Support\Grammar\SqlLiteExtendedGrammar',
            'sqlsrv'    => 'Tschallacka\PageManager\Support\Grammar\SqlServerExtendedGrammar',
    ];

    /**
     * Set the grammar to a certain driver
     * @param string $driver mysql, postgres, sqlite, sqlsrv, something else
     * @param string $grammar Your extended grammar class '\Foo\Bar\MysqlExtendedGrammar'
     */
    public function setGrammar($driver, $grammar) 
    {
        $this->transforms[$driver] = $grammar;  
    }

    public function getGrammar($driver) {
        if(array_key_exists($driver, $this->transforms)) {
            return $this->transforms[$driver];
        }
        throw new UnexpectedValueException("Unsupported database driver $driver\n"
                ."Please attach a listener to event tschallacka.get.binary_uuid.grammars\n"
                ."and provide an extended grammar for for generating 16 bit binary fields for UUIDs.\n"
                ."Take a look at /plugins/tschallacka/dynamicpages/support/MysqlExtendedGrammar.php");
    }

    public static function tableName($table_name) {
        $prefix = DB::connection()->getTablePrefix();
        return $prefix . $table_name;
    }
    public static function getExtendedSchema() 
    {
        $stutter = new static();
        Event::fire('tschallacka.get.binary_uuid.grammars',[$stutter]);
        $driver = DB::connection()->getConfig('driver');
        $grammar = $stutter->getGrammar($driver);

        DB::connection()->setSchemaGrammar(new $grammar());

        $schema = DB::connection()->getSchemaBuilder();
        $schema->blueprintResolver(function($table, $callback) {
            return new ExtendedBlueprint($table, $callback);
        });

        return $schema;
    }
}

Затем в файле миграции

class CreatePagesTable extends Migration
{
    public function up()
    {

        $schema = Stutter::getExtendedSchema();

        $schema->create(Stutter::tableName('pagemanager_pages'), 
            function(ExtendedBlueprint $table) {
                $table->engine = 'InnoDB';
                $table->increments('id');

                $table->binary_uuid('auid');

                $table->timestamps();
                $table->string('name')->nullable();
                $table->string('slug',2048)->nullable();
                $table->boolean('active')->nullable();

            });
    }

    public function down()
    {
        Schema::dropIfExists('tschallacka_pagemanager_pages');
    }
}

Затем в вашей модели вы можете иметь такие атрибуты, как:

protected function getAuidAttribute() 
{
    static $uuid;
    if(isset($this->attributes['auid'])) {
        if(is_null($uuid)) {
            $uuid = Uuid::import($this->attributes['auid']);
        }
        return $uuid->string;
    }

    return null;
}

protected function beforeCreate() 
{
    $uuid = Uuid::generate(4);
    $this->auid = $uuid->bytes;
    $this->attributes['auid'] = $uuid->bytes;
}

Библиотека UUID iя использую это https://github.com/webpatser/laravel-uuid

уведомление

Я на самом деле использую инфраструктуру Octobercms, которая может отличаться в некоторых моментах на мелкие детали реализации, но большинствоматериал все еще должен выдерживать Laravel, поскольку OctoberCMS - это просто слой поверх Laravel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...