Pass at removing extraneous permissions table and using native MySQL JSON

This commit is contained in:
Dane Everitt 2020-03-22 16:56:00 -07:00
parent 23d594f655
commit 32f25170f1
No known key found for this signature in database
GPG key ID: EEA66103B3D71F53
7 changed files with 132 additions and 32 deletions

View file

@ -0,0 +1,57 @@
<?php
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class MergePermissionsTableIntoSubusers extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('subusers', function (Blueprint $table) {
$table->json('permissions')->nullable()->after('server_id');
});
DB::statement('
UPDATE subusers as s
LEFT JOIN (
SELECT subuser_id, JSON_ARRAYAGG(permission) as permissions
FROM permissions
GROUP BY subuser_id
) as p ON p.subuser_id = s.id
SET s.permissions = p.permissions
');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
foreach (DB::select('SELECT id, permissions FROM subusers') as $datum) {
$values = [];
foreach(json_decode($datum->permissions, true) as $permission) {
$values[] = $datum->id;
$values[] = $permission;
}
if (!empty($values)) {
$string = 'VALUES ' . implode(', ', array_fill(0, count($values) / 2, '(?, ?)'));
DB::insert('INSERT INTO permissions(`subuser_id`, `permission`) ' . $string, $values);
}
}
Schema::table('subusers', function (Blueprint $table) {
$table->dropColumn('permissions');
});
}
}

View file

@ -0,0 +1,34 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class DropPermissionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::dropIfExists('permissions');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::create('permissions', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('subuser_id');
$table->string('permission');
$table->foreign('subuser_id')->references('id')->on('subusers')->onDelete('cascade');
});
}
}