在 Laravel Nova 中是否可以在 ID 字段中显示例如名字和姓氏而不是实际 ID。但后来我仍然希望能够点击它来查询资源并打开该资源的查看页面。 Laravel Nova 在索引页面中显示关系时实际上会自动执行此操作。但是我找不到让 ID 显示为资源名称的方法。
我的 ID 字段是这样制作的:
ID::make()->sortable(),
我的名字和姓氏字段是这样的:
Text::make('Firstname')
->sortable()
->rules('required', 'max:255'),
Text::make('Lastname')
->sortable()
->rules('required', 'max:255'),
但是如果我这样写:
ID::make('Firstname')->sortable(),
它使用名字而不是 ID 查询模型。谁能告诉我如何解决这个问题?
答案 0 :(得分:0)
我的解决方法如下:
创建一个包含名字和姓氏的 TextField,并返回一个使用该实体 ID 的链接。
Text::make('Name', 'firstname', function () {
$url = \Nova::path()."/resources/{$this->uriKey()}/{$this->id}";
$name = $this->firstname.' '.$this->lastname;
return "<a class=\"no-underline dim text-primary font-bold\" href=\"{$url}\">{$name}</a>";
})->asHtml()
->sortable()
->hideFromDetail()
->hideWhenCreating()
->hideWhenCreating(),
这样它仍然可以链接到带有 ID 的资源的详细信息页面。
为了使这个自定义字段可排序,我重写了 indexQuery
函数,如下所示:
public static $defaultSort = 'firstname';
/**
* Build an "index" query for the given resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public static function indexQuery(NovaRequest $request, $query)
{
if (static::$defaultSort && empty($request->get('orderBy'))) {
$query->getQuery()->orders = [];
return $query->orderBy(static::$defaultSort);
}
return $query;
}
变量 $defaultSort
表示要排序的列。