Данные Laravel Livewire преобразуются в массив после рендеринга

#laravel #laravel-livewire

Вопрос:

У меня есть простой компонент livewire, который инициализируется с помощью запрошенных данных из SQL. Ниже приведен код

 public $states=[];

public function mount()
{
    $this->states = DB::select("select id,name from hr_states");
}
 

в представлении:

 <select class="mt-1">
    <option>...select...</option>
    @foreach($states as $state)
        <option value="{{$state->id}}" wire:key="{{$state->id}}">{{$state->name}}</option>
    @endforeach
</select>
 

при первом рендеринге он работает хорошо, но при любом обновлении страницы (при других событиях) выдает ошибку Attempt to read property "id" on array , указывающую на эту строку <option value="{{$state->id}}" wire:key="{{$state->id}}">{{$state->name}}

Поэтому я попытался визуализировать как массив {{$state['id']}} , но это приводит к ошибке Cannot use object of type stdClass as array

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

1. приведите его к массиву с ->toArray() помощью и используйте его как массив все время

2. это не позволяет приковать ->toArray() к DB::select() метанию Call to a member function toArray() on array . Таким образом, проблема в том, что он говорит gettype($this->states) , что есть array , но не позволяет отображать с помощью {{$state['id']}}

Ответ №1:

 class StateComponent extends Component
{  
    public function render()  
    { 
        $states = DB::table("select * from states")->get();  
        return view('livewire.state-component', ['$states'=>$states]) ;
    }   
}
 

в представлении:

 <select class="mt-1"> 
    <option>...select...</option> 
    @foreach($states as $state)
        <option value="{{$state->id}}" wire:key="{{$state->id}}"> 
              {{$state->name}}</option>  
    @endforeach
</select>