OctoberCMSのリスト画面では通常、設定ファイルで指定したモデル(テーブル)の情報を使うことができますが、複数モデルを指定したりはできません。
今回は、指定したモデルに他のテーブルを結合させて、他テーブルのカラムを表示する方法をご紹介します。
環境
- Laravel:5.5
- October CMS:1.0
実装方法
以下はファイル構成です。
今回手を加えるファイルのみを記載しています。
plugins/ casareal/ <=== 作者名 test/ <=== プラグイン名 controllers/ User.php models/ user/ columns.yml
モデルのUser.phpで使用するテーブルは”user”とし、以下のようなカラムで成り立っているとします。
・id /int型 ユーザID(連番)
・name /varchar型 ユーザ名
・prefecture /int型 都道府県ID
結合させるテーブルは”prefecture”とし、以下のようなカラムで成り立っているとします。
・id /int型 都道府県ID
・name /varchar型 都道府県名
OctoberCMSで用意されている「listExtendQuery」というメソッドをオーバーライドすることができるので、Selectのクエリに条件などを加えてテーブル結合を行います。
公式のページ:https://octobercms.com/docs/backend/lists#extend-model-query
User.phpに以下のように記載することで、テーブル結合を行うことができます。
今回はjoinを使っていますが、状況によってleftJoinに変更したり、whereで条件を追加したりして必要なリストが取得できるように調整してください。
public function listExtendQuery($query) { $query->join('prefecture', 'user.prefecture', '=', 'prefecture.id'); }
コントローラに記載ができたら、結合したテーブルのカラムを表示できるようになりましたので、columns.ymlを変更します。
columns.yml
columns: id: label: ユーザID type: number select: user.id name: label: ユーザ名 type: text select: user.name prefecture: label: 都道府県 type: text select: prefecture.name
上記のように、selectオプションで「テーブル.カラム」の形で指定しないと、同じ名前のカラムがあった場合に、欲しい値が取得できなくなってしまう可能性があるので、確実にカラム指定をしたい場合はselectオプションを必ず使用しましょう。
まとめ
以上が、OctoberCMSのリスト画面で他テーブルのカラムを表示する方法でした。
モデルに関係性を記載して、カラムの取得を行う方法もあるにはあるのですが、そちらはまた次の機会にでもご紹介したいと思います。