web-dev-qa-db-fra.com

La propriété [titre] n'existe pas sur cette instance de collection

Je suis les vidéos de Laracasts: Flux de travail modèle/contrôleur/affichage de base .

J'ai une table contient des informations de contact.

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

J'essaie de transmettre des données à afficher à l'aide du code suivant dans le fichier du contrôleur:

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

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

Lorsque j'essaie de montrer le code comme indiqué ci-dessous,

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

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

Je reçois une erreur qui dit:

La propriété [titre] n'existe pas sur cette instance de collection. (Voir: E:\laragon\www\newsite\resources\views\about.blade.php)

Mais si je change la méthode de récupération dans le fichier du contrôleur, cela fonctionne.

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

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

Lorsque j'utilise dd($about) dans le premier cas (where()->get()), les données sont encapsulées dans un tableau. Dans le second cas (find(3)), il affiche les données comme prévu.

Qu'est-ce que je fais mal?

61
zkanoca

Lorsque vous utilisez get(), vous obtenez un collection. Dans ce cas, vous devez itérer dessus pour obtenir les propriétés:

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

Ou vous pouvez simplement obtenir un des objets par son index:

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

Ou obtenez le premier objet de la collection:

{{ $collection->first() }}

Lorsque vous utilisez find() ou first() vous obtenez un objet, vous pouvez donc obtenir des propriétés avec les éléments suivants:

{{ $object->title }}
157
Alexey Mezenin

Avec la méthode get() vous obtenez une collection (toutes les données qui correspondent à la requête), essayez plutôt d'utiliser first(), elle ne renvoie qu'un élément, comme ceci:

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

au lieu deget().

Cela fonctionne sur mon projet. Merci.

1
Phantih

Vous devriez utiliser le mot clé Collection dans le contrôleur. Comme ici..

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

Ici, l'utilisateur correspond au nom de la ressource et le profil au nom du modèle. Merci.

1
Pnj Patel