與過濾器類似, 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 的字段。
每一個(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];
}
更多建議: