Laravel-adminのformでリレーションデータをdisplayする方法

Laravel-admin の form メソッド内で、リレーションした Model のデータを表示する方法です。

今回のケースでは、記事編集者の情報は admin_users テーブルに

記事の情報は articles テーブルにあり、articles テーブルに admin_user_id カラムがある状態です。

そこで、form メソッドで記事編集者の名前を表示したいという想定です。

まずは、Article モデルと AdminUser モデルを作成します。

次に、Article モデルにリレーションを定義します。

public function admin_user()
{
    return $this->hasOne(AdminUser::class, 'id', admin_user_id');
}

form では、Article クラスを引数に form インスタンスを生成し、

display メソッドの第一引数に、リレーションのメソッドとドットでカラムをつなぎます

protected function form()
{
    $form = new Form(new Article());

    $form->display('admin_user.username', __('記事編集者'));

    return $form;
}

これで、記事の編集画面に記事編集者の表示ができます。

Laravel-adminの投稿画面で記事のIDを取得する方法

Laravel-admin のバージョンが上がり、form メソッドの引数に記事 ID が渡らなくなりました。

(少なくとも 1.8 から。もっと以前のバージョンで既にそうなっているかもしれません)

そこで、記事の ID を取得する方法です。

私のケースでは、他の投稿者の記事を編集できないように制御したかったです。

ID を取得するには、記事のパスが article だった場合

request()->route()->parameters['article']

で取得できます。

また、他の投稿者の記事を編集しようとした場合に 404 に飛ばしたければ

記事のテーブルに admin_user_id のカラムを用意して

form メソッドの先頭とかで

if ($form->isEditing()) {
    $articleId = request()->route()->parameters['article'];
    $thisArticleAdminUserId = Article::where('id', $articleId)->first()->admin_user_id;

    if ($thisArticleAdminUserId !== Admin::user()->id) {
        abort(403);
    }
}

とすることで制御することができます。

また、そもそも一覧(grid)に表示しない場合は

grid の先頭とかで

$grid->model()->where('admin_user_id', '=', Admin::user()->id);

とすることで、一覧には自分が投稿した記事しか表示されないようにできます。

Laravel の apache 設定

チュートリアルを進めていて、/tasks の URL に遷移しても、

index.php ではなく、/public/tasks にアクセスしようとしてしまう場合。

 

公式ドキュメント

https://readouble.com/laravel/5.1/ja/installation.html

にも書いてあるが、.htaccess が動作していない可能性がある。

そのときには、apache の .conf ファイルに下記のように設定をする。

<VirtualHost *:80>
    DocumentRoot /path/to/public/
    ServerName foo.example.com
    <Directory /path/to/public>
        Options Indexes
        AllowOverride None
        Require all granted

        Options +FollowSymLinks
        RewriteEngine On

        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ index.php [L]
    </Directory>
</VirtualHost>