La propiedad [título] no existe en esta instancia de colección

95

Estoy siguiendo los videos de Laracasts: Modelo básico / Controlador / Ver flujo de trabajo .

Tengo una mesa con información de contacto.

CREATE TABLE `about` (
`id` int(10) UNSIGNED NOT NULL,
`title` varchar(500) COLLATE utf8_unicode_ci NOT NULL,
`content` text COLLATE utf8_unicode_ci,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Estoy tratando de pasar datos para ver usando el siguiente código en el archivo del controlador:

public function index()
{
    $about = Page::where('page', 'about-me')->get(); //id = 3

    return view('about', compact('about'));
}

Cuando intento mostrar el código como se muestra a continuación,

@section('title')
    {{$about->title}}
@stop

@section('content')
    {!! $about->content !!}
@stop

Recibo un error que dice:

La propiedad [título] no existe en esta instancia de colección. (Ver: E: \ laragon \ www \ newsite \ resources \ views \ about.blade.php)

Pero si cambio el método de recuperación en el archivo del controlador, funciona.

public function index()
{
    $about = Page::find(3);

    return view('about', compact('about'));
}

Cuando utilizo dd($about)en el primer caso ( where()->get()), los datos están encapsulados por una matriz. En el segundo caso ( find(3)) muestra los datos como se esperaba.

¿Qué estoy haciendo mal?

zkanoca
fuente

Respuestas:

233

Cuando estás usando get()obtienes una colección . En este caso, debe iterar sobre él para obtener propiedades:

@foreach ($collection as $object)
    {{ $object->title }}
@endforeach

O simplemente puede obtener uno de los objetos por su índice:

{{ $collection[0]->title }}

O obtenga el primer objeto de la colección:

{{ $collection->first() }}

Cuando está usando find()o first()obtiene un objeto , entonces puede obtener propiedades con simple:

{{ $object->title }}
Alexey Mezenin
fuente
sí, después de ejecutar Model-> get () obtengo una lista con un objeto, por esa razón siempre mostrar datos y no puedo acceder a eso. Después de exaltar primero () luego obtener objeto
Rubén Ruíz
2
Después de 4 HORAS de buscar, leer y probar la documentación de Laravel y visitar MUCHAS preguntas / respuestas de StackOverflow, usted fue el único que mencionó que get () recupera una colección. Fuiste tú quien me hizo saltar de la silla y darme cuenta de que todas mis consultas eran correctas. El problema estaba en la "impresión". Desde el fondo de mi corazón, ¡muchas gracias por esta respuesta! ¡Lo digo en serio!
Grinnex.
22

Con el get()método obtienes una colección (todos los datos que coinciden con la consulta), intenta usar first()en su lugar, devuelve solo un elemento, como este:

 $about = Page::where('page', 'about-me')->first();
Alex
fuente
2
$about = DB::where('page', 'about-me')->first(); 

en lugar de get() .

Funciona en mi proyecto . Gracias.

Phantih
fuente
3
Si bien esto podría responder a la pregunta de los autores, carece de algunas palabras explicativas y / o enlaces a la documentación. Los fragmentos de código sin formato no son muy útiles sin algunas frases a su alrededor. También puede resultarle muy útil cómo escribir una buena respuesta . Por favor, editar su respuesta - De la opinión
Nick
1

Debería utilizar la palabra clave Collection en Controller. Como aquí..

public function ApiView(){
    return User::collection(Profile::all());
}

Aquí, el usuario es el nombre del recurso y el perfil es el nombre del modelo. Gracias.

Pnj Patel
fuente
1

Una persona puede obtener esto mientras trabaja con funciones de fábrica, por lo que puedo confirmar que esta es una sintaxis válida:

$user = factory(User::class, 1)->create()->first();

Es posible que vea el error de instancia de colección si hace algo como:

$user = factory(User::class, 1)->create()->id;

así que cámbialo a:

$user = factory(User::class, 1)->create()->first()->id;
agm1984
fuente
0

$about->first()->ido $stm->first()->titley su problema está resuelto.

Onyash Ed
fuente
Mi sugerencia de código funciona en Tinker pero no en el proyecto.
Onyash Ed