質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
laravel-admin

laravel-adminは、Laravelに対して管理者用インタフェースを実装するために必要な部品を補うライブラリ。コントローラーでのCRUD処理が可能で、フォームやテーブルに使う値の整形およびテンプレートも提供されています。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

7027閲覧

Laravel-adminのGrid画面において、リレーション先のカラムでsortable()を使うとエラーが出る

horihory

総合スコア4

laravel-admin

laravel-adminは、Laravelに対して管理者用インタフェースを実装するために必要な部品を補うライブラリ。コントローラーでのCRUD処理が可能で、フォームやテーブルに使う値の整形およびテンプレートも提供されています。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/04/27 02:36

編集2021/04/27 12:09

前提・実現したいこと

Laravel-adminで、複数テーブルを使ったデータ管理システムを作成しています。

Grid画面において、リレーション先のカラムでsortable()を使ったソート機能を実現したいのですが、以下のエラーが出てしまいます。

発生している問題・エラーメッセージ

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'JSON_EXTRACT(customer, '$.name')' in 'order clause' (SQL: select * from `sales` order by `JSON_EXTRACT(customer, '$`.`name')` desc limit 20 offset 0)

該当のソースコード

Table

1customers 2 - id 3 - name 4 5sales 6 - id 7 - item 8 - customer_id

SaleController

1class SaleController extends AdminController 2{ 3 protected function grid() 4 { 5 $grid = new Grid(new Sale()); 6 $grid->column('id', __('ID'))->sortable(); 7 $grid->column('item', __('商品名'))->sortable(); 8 $grid->column('customer_id', __('顧客ID'))->sortable(); 9 $grid->column('customer.name', __('顧客名'))->sortable(); 10 return $grid; 11 } 12}

Sale

1namespace App\Models; 2use Illuminate\Database\Eloquent\Factories\HasFactory; 3use Illuminate\Database\Eloquent\Model; 4use App\Models\Customer; 5 6class Sale extends Model 7{ 8 use HasFactory; 9 public function customer() 10 { 11 return $this->belongsTo(Customer::class, 'customer_id'); 12 } 13}

Customer

1namespace App\Models; 2use Illuminate\Database\Eloquent\Factories\HasFactory; 3use Illuminate\Database\Eloquent\Model; 4use App\Models\Sale; 5 6class Customer extends Model 7{ 8 use HasFactory; 9 public function sales() 10 { 11 return $this->hasMany(Sale::class); 12 } 13}

試したこと

自テーブルのカラム (id, item, customer_id)では、ソート機能は正常に動作しています。

Laravel-adminのソースコードも見てみました。
/vendor/encore/laravel-admin/src/Grid/Model.php
に、
setRelationSort($column)
という関数も定義されているので、機能としては実装されています。
なので、私の使い方に問題があるのだろうと考えております。

補足情報

【開発環境】
Laravel-admin:v1.8.11
Laravel:v8.22.0 (PHP v7.4.2)

【参考サイト】
Laravel-admin公式ドキュメント (Model grid / Column Sorting)
上記ドキュメントを一通り見たのですが、リレーション先のカラムでのソートについての詳細な説明を見つけられませんでした。

GitHub (Relational sorting issue #2283)
私とは違う現象での不具合報告ですが、ここの質問文のソースを見る限り、私の実装方法と違いがないように見えます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

下記のLaravel-adminのGitHubページで、同様のエラー報告を見つけました。
GitHub (Relation sorting broken after updating to laravel 8 #5016)

上記ページのコメントで提案されていたように、laravel-adminのvendorのソースを変更したところ、エラーがなくなりソートできるようになりました。

/vendor/encore/laravel-admin/src/Grid/Model.php
setSort()関数

before

1protected function setSort() 2{ 3 // (省略) 4 $columnNameContainsDots = Str::contains($columnName, '.'); 5 6 $isRelation = $this->queries->contains(function ($query) use ($columnName) { 7 return $query['method'] === 'with' && in_array($columnName, $query['arguments'], true); 8 }); 9 10 if ($columnNameContainsDots === true && $isRelation) { 11 // (省略)

after

1protected function setSort() 2{ 3 // (省略) 4 $columnNameContainsDots = Str::contains($columnName, '.'); 5 6 if ($columnNameContainsDots === true) { 7 // (省略) 8

現時点(2021年5月9日)では、GitHubのコードに修正が入る様子がないので、同様の現象が起きた人は各自でvendorのソースを変更するしかなさそうです。

投稿2021/05/09 08:33

horihory

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問