Laravel 9 y Livewire 2 - Error de colección como objeto o como array

Más
7 meses 1 semana antes - 7 meses 1 semana antes #59 por Luis-Spindola-google-1
En livewire 2. (no estoy seguro si esta situación sigue ocurriendo en livewire 3), se presenta el error: "Cannot use object of type stdClass as array".



Esto ocurre cuando tenemos que cargar una colección de datos con una gran cantidad de información, lo cual ralentizaría el componente si esta consulta se pone en el "render". Por lo anterior para evitar realizar una consulta muy pesada varias veces esta consulta se hace en el "mount", cargando los datos en una variable "public":
<?php

namespace App\Http\Livewire\Adminalumnos\ActasExtemporaneas;

use App\Models\Adminalumnos\AlumnoModel;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rules\RequiredIf;
use Livewire\Component;

class AlumnoActaComponent extends Component
{
    
    public $coleccion_grande;
    
    public function mount()
    {
            //ejemplo de consulta grande:
            $sql = "SELECT cat_dkdk, ";
            $sql = $sql."emdjd, djdjj, okfka, oldi,  ";
            $sql = $sql."FROM cat INNER JOIN users ON cat_s.email = users.email ";
            $sql = $sql."INNER JOIN eil ON emp_perfil.user_id = users.id ";
            $sql = $sql."INNER JOIN eml_plantele ON emele.perfil_id = eml.id ";
            $sql = $sql."WHERE emlantele.pld = ".$this->dato." ";
            $sql = $sql."ORDER BY emil";
            
            $this->coleccion_grande = DB::select($sql);
        }
        
    }

    public function render()
    {
        return view('vista_del_componente');
    }
}

Al realizar esto y por ejemplo cargar los datos de la vista con un foreach
@foreach($coleccion_grande as $dato)
    <td>{{ $dato->nombre }}</td>
@endforeach

Vemos que al ejecutar el render la primera vez si funciona y carga el foreach. Pero al ejecutar el render por segunda ocación (por motivos de cambios de algún input enlazado a livewire). Marca el error mostrado en la imagen.

Esto ocurre por que la segunda vez que liveware 2 carga una coleccion creada desde el mount, lo hace como arreglo.
Para solucionar esto podemos convertir el dato en arreglo desde el principio quedando la vista asi:
@foreach($coleccion_grande as $dato)
   @php
     //Aqui se asegura $dato sea un array:
    if (is_object($dato)) 
    {
         $dato= (array) $dato;
    }
    @endphp

    <td>{{ $dato['nombre']}}</td>

@endforeach

No sé si esta situación también ocurre en la version 3 de livewire, espero les sea de ayuda. B)
Adjuntos:
Última Edición: 7 meses 1 semana antes por Luis-Spindola-google-1.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Tiempo de carga de la página: 0.052 segundos