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'),
BelongsToMany::make('Things', 'parentOf')
];
}

您可以通过AppNovaRessourcerelatableQuery方法来解决这个问题。只需在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
}
}

你可以在这里找到文档

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

相关内容

  • 没有找到相关文章

最新更新