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?

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 }}

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();

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

en lugar de get() .

Funciona en mi proyecto . Gracias.


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.


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;

0

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


Mi sugerencia de código funciona en Tinker pero no en el proyecto.
— Onyash Ed
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.