laravel-adminで多対多(belongsToMany)を使う。multiple-selectのエラーはモデルのリレーションを見直せ!

パン田@現役エンジニア
こんにちは!パン田です。
今回はlaravel-adminの多対多(many-to-many)でよく陥るエラーの見直しポイントを。

基本的な多対多の実装の仕方は、他のブログが優秀なので基本の説明は譲ります。

Laravel 5.7 Laravel-admin リレーションを追加する

が、僕はこれではうまくいきませんでした。
DBのエラーが出るのですよ。。

そんな時の見直しポイントはこの2点。

  • モデルのbelognsToManyの第二引数に、中間テーブルのテーブル名をつける
  • multipleSelectの引数は複数形にする

 

まずは完成のソースコードから。

laravel-adminのコントローラ

Admin/Controller/TagMovieController.php

    protected function form($id = null)
    {
        $form = new Form(new Movie);

        $form->text('title', 'タグ名');
     # 上記のブログだと単数のtagになるけど、うまくいくのは複数形。ちなみに公式リファレンスでも複数形ですよ。と。
        $form->multipleSelect('tags')->options(Tag::pluck('name', 'id'));

        return $form;
    }

 

モデルファイル

app/Movie.php

    public function tags()
    {
        // 第二引数に中間テーブル名を宣言しといたほうが安全。
        // なんか、SQLのtableが存在しません系のエラーはこれで解決した。
        return $this->belongsToMany('App\Tag', 'movie_tags');
    }

 

やっぱり公式リファレンス見ないとダメですね。

個人ブログは素晴らしいんですけど、それを信じ切ってしまうとエラーを解決するのに余計、時間がかかっちゃう。

ということで公式リファレンスはこちらです。

https://laravel-admin.org/docs/#/en/model-form-fields?id=multiple-select

 

githubのソースコードはこちら
https://github.com/z-song/laravel-admin/blob/master/src/Form/Field/MultipleSelect.php

継承の親のソース。optionsとかはこっち。
https://github.com/z-song/laravel-admin/blob/master/src/Form/Field/Select.php

あと、エンジニアの年収を上げる方法やフリーの営業法をツイートしてるんでフォローしてくださいっ!!

 

>> フォローは↓からですよ!