#はじめに
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>