Laravel 的背包:如何有条件地添加 'delete' per-line 按钮?

Backpack for Laravel: how to add 'delete' per-line button conditionally?

我有一个 parent 模型可以有 n 个孩子

所以我只想在没有 children 的情况下显示删除按钮(hasMany 关系必须 return 0 条记录)。

如何在 table 的每一行中显示 'delete' link(在列表操作中),但前提是条件有效?

使用

withCount('children')

文档:withCount


此外,您可以使用 blade 指令包装删除按钮

@can('destroy', $model) disabled @endcan

文档:@can

<?php

namespace App\Policies;

use App\Models\Model;
use App\Models\User;

class ModelPolicy
{
    public function update(User $user, Model $model)
    {
        return $model->children_count === 0;
    }
}

文档:policy

如果没有关联记录,hasMany 关系将 return 为空 Collection。然后您可以继续对集合调用 isEmpty() 以验证没有子记录 (children)。

PHP中的示例:

$parents = Parent::with('children')->get();

然后在您的模板中您可以执行以下操作:

@foreach($parents as $parent)
    @if($parent->children->isEmpty())
        <button>Delete</button>
    @endif
@endforeach

我看到的最简单的选择是为 Delete 按钮使用自定义视图,而不是包中的那个。根据您希望进行此更改的范围:

一个。如果你想在所有 CRUDs 中做到这一点 - 这很简单,只需 运行ning 的 publish the view:

php artisan backpack:publish crud/buttons/delete

这会将文件放入您的 resources/views/vendor/backpack/crud/buttons,供您随意更改。在 the delete button view 中,您有可用的当前条目 $entry,因此您可以根据需要执行类似 $entry->children()->count() 的操作。请注意,这将是 运行 每行一次,因此如果您在 table 中显示 50 行,则您需要找到一种优化方法。

乙。如果你只想对一个 CRUD 这样做(例如,对类别而不是产品),那么你可以做同样的事情(发布按钮视图),但将按钮重命名为不同的东西,比如delete_if_no_children.blade.php 这样它就不会自动用于所有 CRUD。然后仅在您想要的控制器内使用它,在 setupListOperation() 内,通过删除“stock”删除按钮并添加您的:

// using the Backpack array syntax
$this->crud->removeButton('delete');
$this->crud->addButton('line', 'delete', 'view', 'crud::buttons.delete_if_no_children', 'end');

// using the Backpack fluent syntax
CRUD::button('delete')->view('crud::buttons.delete_if_no_children');