Сделайте отдельный компонент livewire для удаления массива пользователей вместе с чертами

Описание

У меня есть красноречивые взаимоотношения между пользователями и ролями. Я создал трейт для массовых действий, поэтому могу удалять пользователей сразу. Теперь мне нужно сделать отдельный компонент livewire для массового удаления пользователей. Но проблема здесь в том, что для признака, который используется в Livewire/Backend/UserController, требуется свойство rowsQuery, которое присутствует в UserController, и, поскольку всякий раз, когда пользователи выбираются для удаления, он вызывает свойство selectedRowsQuery из признака и удаляет пользователя, используя следующие код, $this->selectedRowsQuery->delete();. Как я могу выполнить ту же функцию, указанную выше, используя отдельный компонент livewire.

Урезанные, копируемые фрагменты кода

  • Livewire / Backend / UserController
use App\Http\Livewire\Traits\DataTable\WithBulkActions;

use App\Models\User;

class UserController extends Component
{
    use WithBulkActions;

    public User $user;
    public $filters = [
        'search' => "",
        'email' => null,
        'role' => '',
        'date-min' => null,
        'date-max' => null,
    ];

    protected $listeners = ['sectionRefresh' => '$refresh'];
    
    public function getRowsQueryProperty()
    {
        $query = User::query()
            ->when($this->filters['email'], fn($query, $email) => $query->where('email', 'like', '%'.$email.'%'))
            ->when($this->filters['role'], fn($query, $role) => $query->whereHas('roles', fn ($query) => $query->where('id', $role)))
            ->when($this->filters['search'], fn($query, $search) => $query->where('name', 'like', '%'.$search.'%'))
            ->when($this->filters['date-min'], fn($query, $created_at) => $query->where('created_at', '>=', Carbon::createFromFormat('d/m/Y', $created_at)))
            ->when($this->filters['date-max'], fn($query, $created_at) => $query->where('created_at', '<=', Carbon::createFromFormat('d/m/Y', $created_at)));
        
        return $this->applySorting($query);
    }

    public function getRowsProperty()
    {
        return $this->cache(function () {
            return $this->applyPagination($this->rowsQuery);
        });
    }
    
    public function render()
    {
        return view('livewire.backend.management.audience-management.user-controller', ['users' => $this->rows]);
    }
}
  • Livewire / Черты / WithBulkActions
trait WithBulkActions
{
    public $selectPage = false;
    public $selectAll = false;
    public $selected = [];

    public function renderingWithBulkActions()
    {
        if ($this->selectAll) $this->selectPageRows();
    }

    public function updatedSelected()
    {
        $this->selectAll = false;
        $this->selectPage = false;
    }

    public function updatedSelectPage($value)
    {
        if ($value) return $this->selectPageRows();

        $this->selectAll = false;
        $this->selected = [];
    }

    public function selectPageRows()
    {
        $this->selected = $this->rows->pluck('id')->map(fn($id) => (string) $id);
    }

    public function selectAll()
    {
        $this->selectAll = true;
    }

    public function getSelectedRowsQueryProperty()
    {
        return (clone $this->rowsQuery)
            ->unless($this->selectAll, fn($query) => $query->whereKey($this->selected));
    }
}
  • Livewire / Backend / UserBulkDeletion
use App\Http\Livewire\Traits\DataTable\WithCachedRows;

class UserBulkDeletion extends Component
{
    use WithCachedRows;
    
    public $showUserBulkDeletionModal = false;

    protected $listeners = ['deleteUserBulk'];

    public function deleteUserBulk()
    {
        $this->useCachedRows();

        $this->showUserBulkDeletionModal = true;
    }

    public function confirmDeleteBulk()
    {
        $deleteCount = $this->selectedRowsQuery->count();
        
        foreach ($this->selectedRowsQuery->get() as $queryRow) {
            $queryRow->roles()->detach();
        }

        $this->selectedRowsQuery->delete();
        $this->showUserBulkDeletionModal = false;

        $this->notify('You\'ve deleted '.$deleteCount.' users');
        $this->emit('sectionRefresh');
    }

    public function render()
    {
        return view('livewire.backend.management.audience-management.logical-component.user-bulk-deletion');
    }
}

Контекст

  • Версия Livewire: 2.3.6
  • Версия Laravel: 8.23.1
  • Альпийская версия: 2.8.0
  • Браузер: Chrome

person ToxifiedHashkey    schedule 19.01.2021    source источник