Laravel Nova 定義 Lenses

2023-02-16 17:09 更新

與過濾器類似, Nova lenses 允許你充分的定制資源的底層 Eloquent 查詢。例如,你可能希望列出所有的應(yīng)用的用戶,并按照總的終生收入來排序。創(chuàng)建這樣一個(gè)列表可能需要你連接額外的數(shù)據(jù)表和在查詢中執(zhí)行聚合函數(shù)。聽起來挺復(fù)雜的,但是不要擔(dān)心 - 這正是 lenses 旨在解決的場(chǎng)景:


剛開始,你需要使用 nova:lens Artisan 命令。默認(rèn)情況下,Nova 會(huì)把新創(chuàng)建的 lenses 放置在 app/Nova/Lenses 目錄下:

php artisan nova:lens MostValuableUsers

每一個(gè) Nova 創(chuàng)建的 Lens 都包含幾個(gè)方法。然而,目前我們關(guān)注的兩個(gè)方法是 query 和 fields 方法。query 方法負(fù)責(zé)創(chuàng)建獲取所需數(shù)據(jù)的 Eloquent 查詢,而 fields 方法返回了在查看 lens 時(shí)應(yīng)當(dāng)顯示的字段的數(shù)組。

為了更深入的學(xué)習(xí),我們來看一個(gè)完整 lens,該 lens 顯示了用戶和他們的終生收入:

<?php

namespace App\Nova\Lenses;

use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Lenses\Lens;
use Laravel\Nova\Fields\Number;
use Illuminate\Support\Facades\DB;
use Laravel\Nova\Http\Requests\LensRequest;

class MostValuableUsers extends Lens
{
    /**
     * 獲取 lens 的查詢創(chuàng)建器和分頁(yè)器
     *
     * @param  \Laravel\Nova\Http\Requests\LensRequest  $request
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return mixed
     */
    public static function query(LensRequest $request, $query)
    {
        return $request->withOrdering($request->withFilters(
            $query->select($this->columns())
                  ->join('licenses', 'users.id', '=', 'licenses.user_id')
                  ->orderBy('revenue', 'desc')
                  ->groupBy('users.id', 'users.name')
        ));
    }

    /**
     * 獲取應(yīng)該選擇的列
     *
     * @return array
     */
    protected function columns()
    {
        return [
            'users.id',
            'users.name',
            DB::raw('sum(licenses.price) as revenue'),
        ];
    }

    /**
     * 獲取 lens 可獲取的字段
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function fields(Request $request)
    {
        return [
            ID::make('ID', 'id'),
            Text::make('Name', 'name'),

            Number::make('Revenue', 'revenue', function ($value) {
                return '$'.number_format($value, 2);
            }),
        ];
    }

    /**
     * 獲取 lens 可獲取的過濾器
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function filters(Request $request)
    {
        return [];
    }

    /**
     * 獲取 lens 的 URI
     *
     * @return string
     */
    public function uriKey()
    {
        return 'most-profitable-users';
    }
}            

Columns 方法

在這個(gè)例子中,為了可讀性, columns 方法已經(jīng)從 query 方法中分離出來。它不是「必須」的,同時(shí)也不是 lenses 的一個(gè) 「特性」。

正如你在上面的例子中所見到的, query 方法已經(jīng)完全控制了獲取 lens 數(shù)據(jù)的 Eloquent 查詢。為了讓查詢返回的數(shù)據(jù)合理的展示,fields 方法可以改變?nèi)魏?Nova 的字段。

Lens 過濾器

每一個(gè) Nova lens 都包含一個(gè) filters 方法。這個(gè)方法可以讓你把任何現(xiàn)存的 過濾器 添加到 lens:

use App\Nova\Filters\UserType;

/**
 * 獲取 lens 可以獲取的過濾器
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
public function filters(Request $request)
{
    return [new UserType];
}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)