定义更多字段

使用 laravel nova 定义资源中说到使用 nova 定义资源,这里对不同的资源使用不同的类型的列字段。

给表添加不同类型的列

php artisan make:migration --table=posts add_more_fields_to_posts_table

迁移文件的内容如下:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('posts', function (Blueprint $table) {
        $table->datetime('publish_at')->nullable();
        $table->datetim),publish_until')->nullable();
        $table->boolean('is_published')->default(false);  // 自定义数据库字段名
        $table->string('category')->nullable();
    });
}

/**
    * Reverse the migrations.
    *
    * @return void
    */
public function down()
{
    Schema::table('posts', function (Blueprint $table) {
        $table->dropColumn(['publish_at', 'publish_until', 'is_published', 'category']);
    });
}

执行迁移文件

php artisan migrate

添加字段

use Laravel\Nova\Fields\DateTime;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\Select;
public function fields(Request $request)
{
    return [
        ID::make()->sortable(),
        Text::make('Title')->rules('required')->sortable(),
        Markdown::make('Body')->rules('required'),

        DateTime::make('Publish At'),
        DateTime::make('Publish Until'),
        Boolean::make('Active', 'is_active'),  // 自定义数据库字段名
        Select::make('category')->options([
            'category-1' => 'Category One',
        ])
    ];
}

更多字段可以查看官方文档open in new window

当定义好上面的字段类型后,修改一个文章的Publish AtPublish Until字段,会提示DateTime field must cast to 'datetime' in Eloquent model.,错误。

这是因为我们在模型中定义$casts属性的字段类型。

修改App\Post.php模型中的属性值:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
    protected $casts = [
        'publish_at' => 'datetime',
        'publish_until' => 'datetime',
    ];
}

字段隐藏

通过修改app\Nova\Post.php中的fields方法返回值。

首页隐藏字段

默认在文章的列表页将所有的字段都展示出来,这可能不是真实需求,隐藏publish_atpublish_until字段。

public function fields(Request $request)
{
    return [
        // ...
        DateTime::make('Publish At')->hideFromIndex(),
        DateTime::make('Publish Until')->hideFromIndex(),
        // ...
    ];
}

更新页面隐藏字段

public function fields(Request $request)
{
    return [
        // ...
        Select::make('category')->options([
            'category-1' => 'Category One',
        ])->hideWhenUpdating()
    ];
}

更多的隐藏和显示选项可以查看这里open in new window

  • hideFromIndex
  • hideFromDetail
  • hideWhenCreating
  • hideWhenUpdating
  • onlyOnIndex
  • onlyOnDetail
  • onlyOnForms
  • exceptOnForms

参考地址