駆け出しエンジニアの勉強記録

アラフォー女の未経験すぎる業界での勉強記録

【nova】基礎

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でも可能)
->displayUsing(fn($value) => ($value) ? str_replace('生','',$value) : '')
->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(); // データベースからデータを取得
Log::info(json_encode($data, JSON_UNESCAPED_UNICODE)); // データをJSON形式にエンコードしてログに出力

で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(),