NOVA
nova.laravel.com
nove DB
リソース = テーブル
フィールド = カラム
Http/app/Novaの中に管理画面左側のメニュー分のファイルがある。
基本
①モデル+マイグレファイル作成→マイグレする
②php artisan nova:resource 【アッパーキャメルファイル名(Testと仮定)】
③Http/app/Novaの中にTest.phpファイルができる
左側のメニューラベル変更 → labelに書く
public static function label(){
return 'テスト用';
}
新規作成の中身作成 → fieldsに書く
public function fields(NovaRequest $request)
{
return [
ID::make()->sortable(), // IDメソッド
Text::make('名前','name'), // Textメソッド
DateTime::make('日付と時間','time') //DateTimeメソッド
->step(CarbonInterval::minute(5))
->sortable(),
];
}
Article.phpの中
public function fieldsForIndex(NovaRequest $request){
fieldsForIndex
このメソッドは、管理画面の一覧ページで表示されるものを定義
public function fieldsForDetail(NovaRequest $request){
fieldsForDetail
このメソッドは、管理画面の詳細ページ(👁マーククリック先)で表示されるものを定義
public function fields(NovaRequest $request)
fields
このメソッドは、新規作成で表示されるものを定義
※一覧ページや詳細ページなど、どのページでも共通して表示されるフィールドを定義
【よく使いそうなメソッドの種類】
Text::make('名前','name')
->hideFromIndex() // リストの時に隠す
->hideFromDetail() // 詳細の時に隠す
->hideWhenCreating() // 新規登録の時に隠す
->hideWhenUpdating() // 編集のときに隠す
->filterble() // フィルター検索
->sortable() // リストの時に並び替えできる
->dependsOn('category','notice'), // 選んだカテゴリー条件追加
->readonly() // 詳細しか見れない、編集も削除もできない
Textarea::make('営業種目', 'business_item')
->alwaysShow() //Textareaは詳細で「コンテンツを表示」になるので、これで普通に表示される
Text::make('代表者生年月日','representative.birthdate')
// DB「1970/02/20 生」のデータを、生を除外して「1970/02/20」で表示させる(get attributeでも可能)
->onlyOnIndex(), // インデックスのみ表示
DateTime::make('公開日時設定','opened_at')
->step(CarbonInterval::minutes(1)) // 時間を1分単位で選べる
->displayUsing(fn($value)=> $value ? $value->format('Y/m/d H:i'):'')// 日時表示方法の指定
->rules('required') // 必須の赤※印の表示だが、バリデーションを手動で指定する為、独自のルールを決められる
Select::make('カテゴリー','category') // ('フィールドのラベル名','DBのカラム名')
// params.phpに書いた連想配列指定。
->options(config('params.category'))
//インデックスと詳細ページでは、キーが表示されるので、=>右のvalue(ラベル)を表示する場合はこのオプションを使う
->displayUsingLabels()
->placeholder('選択してください') // 初期値
Select::make('ステータス', 'status') // ('フィールドのラベル名','DBのカラム名')
->options([ // 新規作成や編集時に選択可能なものを設定する
0 => '未処理', // 「未処理」を選択したらDBには0が登録される
1 => '電話済み', // 「電話済み」を選択したらDBには1が登録される
2 => 'DM済み', // 「DM済み」を選択したらDBには2が登録される
])
//インデックスと詳細ページでは、キー(0〜2)が表示されるので、=>右のラベルを表示する場合はこのオプションを使う
->displayUsingLabels()
->required(), // 必須の赤※印の表示
【ddやconsoleの代わりにデータの中身を確認する方法】
logを使う。
fieldsのreturnの前に
$data = Test::all(); // データベースからデータを取得
でlaravel.logで確認できる。
【リレーションの書き方】
// 引数の基本
BelongsToMany::make($name, $relationship, $resource)
// 書き方①
BelongsToMany::make('業種', 'industry', 'App\Nova\Industry'),
// 書き方②
BelongsToMany::make('Tags', 'tags', Tag::class),
$name:
表示されるリレーションフィールドの名前を指定。Novaのフォームに表示されるテキスト。
$relationship:
Eloquentモデルに定義されている多対多のリレーションメソッドを指定。これにより、Novaはどの関連データを取得するかを知ることができる。
$resource:
多対多のリレーションで関連付けられたリソースを指定。これにより、関連データが表示される際にどのNovaリソースを使用するかを定義。
// 引数の基本
BelongsTo::make($name, $attribute = null, $resource = null)
// 書き方①
BelongsTo::make('Company')->sortable()->filterable()->readonly(),
// 書き方②
BelongsTo::make('User', 'user', User::class),
$name:
リレーションフィールドの名前を指定。Novaのフォームに表示されるテキスト。
$attribute:
リレーション先のモデルで、表示したい属性の名前を指定します。この属性が表示される。省略された場合、デフォルトではリレーション先のモデルの__toString メソッドが呼ばれる。
$resource:
リレーション先のリソースを指定。このリソースが関連するデータの詳細などの表示に使用される。省略された場合、Novaはリレーション先のモデルクラスから自動的にリソースを推定しようとする。
【コードの意味】
URL::make('記事タイトルリンク先','url')
->hide() // 初期状態では非表示
->dependsOn('category', // カテゴリによって表示、非表示の切り替え
function(Url $field,NovaRequest $request,FormData $formData){
// カテゴリが【重要なお知らせ】だったら表示させる
if($formData->category == 'notice'){
$field->show();
}
// カテゴリが【レポート】だったら表示させる
elseif($formData->category == 'report'){
$field->show()->rules('required');
}
// カテゴリが【新着情報】または【チケット】だったら表示させる
elseif($formData->category == 'new_information' || $formData->category == 'ticket'){
$field->show();
} // DBに登録されたurlを 詳細ページでのみ表示(=一覧のリストにはurl表示されない)
})->displayUsing(fn() => $this->url)->showOnDetail(),