3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Larabelのcolumn-sortableを使い方

Posted at

#はじめに
Larabelのcolumn-sortableの初歩的な使い方をまとめます。

#環境
・PHP 8.0.1
・Laravel 8.40.0

#tableの構造

class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            $table->string('title');          // タイトル
            $table->text('note')->nullable(); // 内容
            $table->integer('user_id');       // 登録ユーザー
            $table->timestamps();
        });
    }

class CreateArticleTypesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('article_types', function (Blueprint $table): void {
            $table->id();
            $table->foreignId('article_id')->constrained();
            $table->string('type');
            $table->timestamps();
        });
    }

#sortableをcomposerでインストールする

composer require kyslik/column-sortable

#コンフィグファイルを設定する

php artisan vendor:publish --provider="Kyslik\ColumnSortable\ColumnSortableServiceProvider" --tag="config"

#モデル側のリレーション
1対1でのリレーションとする。

class Article extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'note'];

    public function articleType()
    {
        return $this->hasOne(ArticleType::class);
    }
}

#コントローラー
クエリにsortableをつける

class ArticleController extends Controller
{
    public function index()
    {
        $articles = Article::with(['articleType'])->sortable()->get();

        return view('top', ['articles' => $articles]);
    }
}

#モデル側にSortableの設定とソートするフィールドを設定する

use Kyslik\ColumnSortable\Sortable;

class Article extends Model
{
    use HasFactory;
    use Sortable;

    protected $fillable = ['title', 'note'];

    protected $sortable = ['title', 'note'];

    public function articleType()
    {
        return $this->hasOne(ArticleType::class);
    }
}

#ビュー(blade)

<table>
    <tr>
        <td class="title">@sortablelink('title', 'タイトル')</td>
        <td class="note">@sortablelink('note', '内容')</td>
        <td class="type">種別</td>
        <td>編集</td>
        <td>削除</td>
    </tr>

#リレーション先テーブルのフィールドのソートについて
一覧でリレーション先テーブルのフィールドをソート項目を使いたい場合、現段階ではテーブルをJOINしてソートする方法しかなさそうです。
(他に良い方法をご存知であればコメント頂けると幸いです。。。)

class Article extends Model
{
    use HasFactory;
    use Sortable;

    protected $fillable = ['title', 'note'];

    protected $sortable = ['title', 'note'];

    public function articleType()
    {
        return $this->hasOne(ArticleType::class);
    }

    public function typeSortable($query, $direction)
    {
        return $query->leftJoin('article_types', 'article_types.article_id', '=', 'articles.id')
              ->select('articles.*')
              ->orderBy('article_types.type', $direction);
    }
}

・ビュー

<table>
    <tr>
        <td class="title">@sortablelink('title', 'タイトル')</td>
        <td class="note">@sortablelink('note', '内容')</td>
        <td class="type">@sortablelink('type', '種別')</td>
        <td>編集</td>
        <td>削除</td>
    </tr>
3
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?