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.