【发布时间】:2020-12-23 14:17:55
【问题描述】:
我有一个可以有 n 个孩子的父模型
所以我只想在没有子项的情况下显示删除按钮(hasMany 关系必须返回 0 条记录)。
如何在表格的每一行(在列表操作中)显示“删除”链接,但前提是条件有效?
【问题讨论】:
我有一个可以有 n 个孩子的父模型
所以我只想在没有子项的情况下显示删除按钮(hasMany 关系必须返回 0 条记录)。
如何在表格的每一行(在列表操作中)显示“删除”链接,但前提是条件有效?
【问题讨论】:
我看到的最简单的选择是为Delete 按钮使用自定义视图,而不是包中的那个。取决于您希望进行此更改的范围:
A.如果您想在所有 CRUD 中执行此操作 - 很简单,只需运行 publish the view:
php artisan backpack:publish crud/buttons/delete
这会将文件放在您的resources/views/vendor/backpack/crud/buttons 中,供您随意更改。在the delete button view 中,当前条目为$entry,因此您可以根据需要执行$entry->children()->count() 之类的操作。请注意,这将每行运行一次,因此,例如,如果您在表中显示 50 行,则需要找到一种优化方法。
B.如果您只想为一个 CRUD 执行此操作(例如,为类别而不是产品),那么您可以执行相同的操作(发布按钮视图),但将按钮重命名为不同的名称,例如 @ 987654328@ 以便它不会自动用于所有 CRUD。然后仅在您想要的控制器内使用它,在 setupListOperation() 内,删除“库存”删除按钮并添加您的:
// 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');
【讨论】:
使用
withCount('children')
文档:withCount
此外,您可以使用刀片指令包装删除按钮
@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 关系将返回空的 Collection。然后您可以继续在集合上调用isEmpty() 以验证没有子记录(孩子)。
PHP 中的示例:
$parents = Parent::with('children')->get();
然后在你的模板中你可以这样做:
@foreach($parents as $parent)
@if($parent->children->isEmpty())
<button>Delete</button>
@endif
@endforeach
【讨论】: