【Laravel-admin】Laravel-admin便利な拡張機能(Extension)たち紹介7

概要

私がLaravel-adminで構築する際に基本的に追加する拡張機能を紹介します。
最終回の今日は、「grid-sortable」を紹介します。

【Laravel-admin】Laravel-admin便利な拡張機能(Extension)たち紹介1

Laravel-Admin構築までの環境構築は、以下の記事を参考にしてください。
【Laravel】MacにLaravelインストールしてみた(Virtalbox + Vagrant + homestead) 」
【Laravel-admin】Laravel-adminインストールしてみた

環境

MacBook Air (Retina, 13-inch, 2020)
メモリ: 16 GB
macOS: Big Sur バージョン 11.6.1

仮想環境
VirtualBox 6.1.28
Vagrant 2.2.19
Laravel/Homestead 11.5.0 ( Ubuntu 20.04.3 LTS, PHP 8.0.11 )
Laravel Framework 8.70.2
mysql  Ver 8.0.26-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu))
encore/laravel-admin ^1.8

grid-sortable拡張機能を追加

grid-sortableを追加・紹介していきたいと思います。
参考
Link: https://github.com/laravel-admin-extensions/grid-sortable

Install

composer require laravel-admin-ext/grid-sortable -vvv

公開状態にします。

php artisan vendor:publish --provider="Encore\Admin\GridSortable\GridSortableServiceProvider"

実行すると、vendor配下のAssetsが、公開ディレクトリへコピーされます。

Copied Directory [/vendor/laravel-admin-ext/grid-sortable/resources/assets] To [/public/vendor/laravel-admin-ext/grid-sortable]
Publishing complete.

grid-sortableを適用する

テーブル作成

マイグレーションを使って、テーブルの作成

マイグレーションについては、公式サイトに解説されています。
Link: https://readouble.com/laravel/5.5/ja/migrations.html

ファイル名は、これまで作成してきたテーブルのファイル名に合わせてみました。
 FileName: database/migrations/2021_11_23_000000_create_test_movies_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTestMoviesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('test_movies', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->integer('director');
            $table->string('describe');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('test_movies');
    }
}

マイグレーションを実行

php artisan migrate

”test_movies"が作成されたことを確認する。

mysql> show tables;
+------------------------+
| Tables_in_laraadmindb  |
+------------------------+
| admin_config           |
| admin_menu             |
| admin_operation_log    |
| admin_permissions      |
| admin_role_menu        |
| admin_role_permissions |
| admin_role_users       |
| admin_roles            |
| admin_user_permissions |
| admin_users            |
| failed_jobs            |
| migrations             |
| password_resets        |
| personal_access_tokens |
| test_movies            |
| users                  |
+------------------------+
16 rows in set (0.01 sec)

モデルを作成する

以下のコマンドを実行することで、以下の場所にモデルが作成されます。
FileName: app/Models/TestMovies.php

	php artisan make:model Models/TestMovies

作成されたモデル。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class TestMovies extends Model
{
    use HasFactory;
}

コントローラを作成する

以下のコマンドを実行して、先ほど作成したモデルとの関連付けをしながらコントローラを作成します。

FileName: app/Admin/Controllers/TestModelsController.php

php artisan admin:make TestModelsController --model='App\Models\TestMovies'
“app/Admin/routes.php"にルーティングを設定しなさいと指示があるのでそのまま入れてみる。

ルーティング設定する

”$router->resource('test-movies’, TestModelsController::class);”を追加
FileName: app/Admin/routes.php 

<?php

use Illuminate\Routing\Router;

Admin::routes();

Route::group([
    'prefix'        => config('admin.route.prefix'),
    'namespace'     => config('admin.route.namespace'),
    'middleware'    => config('admin.route.middleware'),
    'as'            => config('admin.route.prefix') . '.',
], function (Router $router) {

    $router->get('/', 'HomeController@index')->name('home');

    $router->resource('test-movies', TestModelsController::class);

});

アクセスしてみる。
Url: http://laravel-admin.test/admin/test-movies

適当にデータをエントリーします。

ここからが本題ですね。
この画面に"grid-sortable"を適用してみます。

テーブルに"grid-sortable"用の並び替えカラムを追加します。
マイグレーションファイルをコマンドで作成してみます。
*お気づきだろうか、、、alterするならさっきのcreateで追加しとけっ!って感じですね。。。

テーブルを変更する

以下のコマンドを実行するとタイムスタンプがファイル名の頭についてファイルが生成されます。
FileName: database/migrations/YYYY_MM_DD_hhmmss_create_test_movies_table_alter.php

php artisan make:migration create_test_movies_table_alter --table=test_movies

ファイルを開いて、生成時、ロールバック時の記述をしていきます。

今回は、カラム"director"を “order_column"に名称を変更してみたいと思います。
マイグレーションファイルを開き、以下のようにup()とdown()メソッド内のSchema::table内に名称変更の処理を記述します。

$table->renameColumn('{変更前カラム名称}', '{変更後カラム名称}');
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTestMoviesTableAlter extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('test_movies', function (Blueprint $table) {
            // カラム名称を変更する.
            $table->renameColumn('director', 'order_column');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('test_movies', function (Blueprint $table) {
            // カラム名称を戻す.
            $table->renameColumn('order_column','director');
        });
    }
}

変更を反映します。

php artisan migrate

変更前と変更後を載せます。

mysql> DESCRIBE test_movies;
+--------------+-----------------+------+-----+---------+----------------+
| Field        | Type            | Null | Key | Default | Extra          |
+--------------+-----------------+------+-----+---------+----------------+
| id           | bigint unsigned | NO   | PRI | NULL    | auto_increment |
| title        | varchar(255)    | NO   |     | NULL    |                |
| director     | int             | NO   |     | NULL    |                |
| describe     | varchar(255)    | NO   |     | NULL    |                |
| created_at   | timestamp       | YES  |     | NULL    |                |
| updated_at   | timestamp       | YES  |     | NULL    |                |
+--------------+-----------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

mysql> DESCRIBE test_movies;
+--------------+-----------------+------+-----+---------+----------------+
| Field        | Type            | Null | Key | Default | Extra          |
+--------------+-----------------+------+-----+---------+----------------+
| id           | bigint unsigned | NO   | PRI | NULL    | auto_increment |
| title        | varchar(255)    | NO   |     | NULL    |                |
| order_column | int             | NO   |     | NULL    |                |
| describe     | varchar(255)    | NO   |     | NULL    |                |
| created_at   | timestamp       | YES  |     | NULL    |                |
| updated_at   | timestamp       | YES  |     | NULL    |                |
+--------------+-----------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

テーブルを変更しただけだと、LaravelAdmin画面で見るとカラム名称が変わったのでこんな感じになります。
なんとエラーにはならないのですよ。。。

コントローラを修正する

1."director"を “order_column"に名称を変更

2."Director"を"Sort Order" にラベルを変更

修正箇所は、3箇所ありました。
grid(), detail(), form()メソッド内

FileName: app/Admin/Controllers/TestModelsController.php

修正したら確認してみます。

変更されましたね。

モデルを修正する

1.参照に以下を追加
use Spatie\EloquentSortable\Sortable;
use Spatie\EloquentSortable\SortableTrait;

2.参照から以下を削除
use Illuminate\Database\Eloquent\Factories\HasFactory;

3.クラスに"implements Sortable"インターフェース追加

4."use HasFactory;"を"use SortableTrait;"に変更

5.グローバル変数に $sortable 定義を追加

FIleName: app/Models/TestMovies.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Spatie\EloquentSortable\Sortable;
use Spatie\EloquentSortable\SortableTrait;

class TestMovies extends Model implements Sortable
{
    use SortableTrait;

    public $sortable = [
        'order_column_name' => 'order_column',
        'sort_when_creating' => true,
    ];
}
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\EloquentSortable\Sortable;
use Spatie\EloquentSortable\SortableTrait;

class TestMovies extends Model implements Sortable
{
    use HasFactory;

    public $sortable = [ 
        'order_column_name' => 'order_column',
        'sort_when_creating' => true,
    ];
}

コントローラを修正する

1. grid()メソッド内のnew Grid後に以下を追加する。
$grid->sortable();

FileName: app/Admin/Controllers/TestModelsController.php

    protected function grid()
    {
        $grid = new Grid(new TestMovies());

        $grid->sortable();

修正したら確認してみます。

赤枠で囲んだところにソート用のつまみができました。

モデル作ったりコントロール作ったりと盛りだくさんな内容になってしまいました。
お疲れ様でした。

並び替え処理がこれくらいのコーディングで適応できるなら大変助かりますね。

7回に渡って、やってきた紹介したい拡張機能シリーズは、如何だったでしょうか。
読者の皆様に少しでも役立ててもらえればと思います。
それでは、この辺で