Laravel Livewire — получить все значения флажков

#php #laravel #laravel-livewire

#php #laravel #laravel-livewire

Вопрос:

Я хочу добавить фильтры в свою таблицу. Мои фильтры — это уровень безопасности учетной записи. Вот мой HTML

 <input type="checkbox" value="O" wire:model="level" id="O">
<label for="O">O</label>
<input type="checkbox" value="a" wire:model="level" id="a">
<label for="a">A</label>
<input type="checkbox" value="b" wire:model="level" id="b">
<label for="b">B</label>
<input type="checkbox" value="c" wire:model="level" id="c">
<label for="c">C</label>
  

И есть мой компонент Livewire:

 <?php

namespace AppHttpLivewire;

use LivewireComponent;
use AppModelsUser;

class Compliance extends Component
{

    public $level = [];

    public function render()
    {
        return view('livewire.compliance', [
            'customers' => $this->row
        ]);
    }

    public function getRowsQueryProperty()
    {
        $query = User::query()
            ->when($this->level, fn($query, $levels) => $query->level($levels));

        return $query;
    }

    public function getRowsProperty()
    {
        return $this->rowsQuery->paginate(20);
    }
}
  

Моя проблема в том:
$this->level всегда представляет собой только одно значение, а не массив значений, например

 [
     0 => 'O',
     1 => 'a'
]
  

Я хотел бы, чтобы все флажки были отмечены каждый раз, когда я устанавливаю или снимаю флажок.
Спасибо за чтение

Комментарии:

1. В livewire вы можете сделать точечную нотацию? так что не будет делать level.0, level.1… достаточно?

2. В HTML? Я пробовал использовать level.a level.b в wire:model, но всегда одна и та же проблема, при рендеринге у меня есть массив с 0 => ‘a’ или 0 => ‘b’, но никогда не было значения 2 в том же массиве

Ответ №1:

Вы могли бы добавить провод: нажмите. Например, измените поля ввода следующим образом:

 <input type="checkbox" wire:click="levelClicked" value="a" wire:model="level" id="a">
  

И в компоненте соответствия добавьте новый метод:

 public function levelClicked()
{
    // now the property $this->level will contain all the selected values
}
  

Комментарии:

1. Просто комментарий для таких новичков, как я: level var должен быть объявлен как public $level = []; в компоненте, иначе все флажки будут проверены сразу.

Ответ №2:

Хорошо, можно щелкнуть и добавить в массив, или из блейда сделать что-то вроде этого.

 <form>
  @foreach($checkboxes as $checkbox)
         <div class="mt-1">
              <label class="inline-flex items-center">
              <input type="checkbox" value="{{ $checkbox->id }}" wire:model="level.{{ $checkbox->id }}" class="form-checkbox h-6 w-6">
                   <span class="ml-3 text-sm">{{ $checkbox->name }}</span>
               </label>
          </div>
  @endforeach
</form>
  

Таким образом, когда вы отправляете форму, все значения будут внутри $level массива.