laravel nova - 如何制作一个有限制的自引用模型

问题描述

我有一个基于下表的 Laravel 模型:

public function up()
{
    Schema::create('things',function (Blueprint $table) {
        $table->id();
        $table->timestamps();
        $table->string('label');
        $table->foreignId('user_id')->nullable()->constrained('users');
    });

还有一个数据透视表,使它成为多对多的自引用模型。

  public function up()
  {
    Schema::create('thing_thing',function (Blueprint $table) {
      $table->id();
      $table->timestamps();
      $table->string('message')->nullable();
      $table->unsignedBigInteger('parent_id')->nullable();
      $table->unsignedBigInteger('child_id')->nullable();
      $table->unique(['parent_id','child_id']);
      $table->foreign('parent_id')->references('id')->on('things')->onDelete('cascade');
      $table->foreign('child_id')->references('id')->on('things')->onDelete('cascade');
    });
  }

当我创建链接到此模型的 Nova 资源时,我想限制将 thing 附加到自身。因此,例如,带有 thingid = 1 不会出现在带有 id = 1 的事物的附件的选择器中。这是我的 Nova 资源:

  public function fields(Request $request)
  {
    return [
      ID::make(__('ID'),'id')->sortable(),Text::make('label'),ID::make('user_id')->hideWhenUpdating()->hideWhenCreating(),BelongsToMany::make('Trees','trees'),BelongsToMany::make('Things','childOf'),'parentOf')
    ];
  }

解决方法

您可以通过 App\Nova\RessourcerelatableQuery 方法解决此问题。只需覆盖您的 nova 资源中的方法:

class Thing extends Resource {

    // ...

    public static function relatableQuery(NovaRequest $request,$query)
    {
        // Make sure you only apply the filter to the things-things relatable query
        if( $request->route('resource') === 'things' ) {
            $currentId = $request->route('resourceId');
            $query->where('id','!=',$currentId);
        }
        return $query
    }
}

您可以找到文档 here

此外,您可能希望在迁移中使 parent_idchild_id 的列组合唯一,以进一步确保唯一性。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...