135 votes

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

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

J'ai un tableau qui contient les 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 à la vue en utilisant le 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 d'afficher 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. (Vue : E:\laragon\www\newsite\resources\views\about.blade.php )

Mais si je modifie 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 de travers ?

344voto

Alexey Mezenin Points 86781

Lorsque vous utilisez get() vous obtenez un collection . Dans ce cas, il est nécessaire d'itérer 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 obtenir le premier objet de la collection :

{{ $collection->first() }}

Lorsque vous utilisez find() o first() vous obtenez un objet Vous pouvez donc obtenir des biens immobiliers en toute simplicité :

{{ $object->title }}

1 votes

Oui, après l'exécution de Model->get() on obtient une liste avec un seul objet, ce qui fait que les données sont toujours affichées et que je ne peux pas y accéder. Après avoir exécuté first() puis obtenu l'objet

20 votes

Après 4 HEURES de recherche, de lecture et de test de la documentation Laravel et après avoir visité BEAUCOUP de questions/réponses StackOverflow, tu as été le seul à mentionner que get() récupère une collection. C'est vous qui m'avez fait sauter de ma chaise et réalisé que toutes mes requêtes étaient correctes. Le problème se situait au niveau de l'"impression". Du fond du cœur, un grand merci pour cette réponse ! Je le pense vraiment !

1 votes

La meilleure explication qui soit

42voto

Alex Points 1121

Avec get() vous obtenez une collection (toutes les données qui correspondent à la requête), essayez d'utiliser la méthode first() au lieu de cela, il ne renvoie qu'un seul élément, comme ceci :

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

5voto

agm1984 Points 3539

Une personne peut être confrontée à ce problème lorsqu'elle travaille avec des fonctions d'usine, et je peux donc confirmer qu'il s'agit d'une syntaxe valide :

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

Vous pouvez voir l'erreur d'instance de collection si vous faites quelque chose comme :

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

il faut donc le changer en :

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

4voto

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

au lieu de get() .

Il fonctionne sur mon projet . Merci.

3 votes

Bien que cela puisse répondre à la question de l'auteur, il manque quelques mots d'explication et/ou des liens vers la documentation. Les extraits de code bruts ne sont pas très utiles s'ils ne sont pas accompagnés de phrases. Vous pouvez également trouver comment rédiger une bonne réponse très utile. Je vous prie d'agréer, Madame, Monsieur, l'expression de mes salutations distinguées. éditer votre réponse - De la revue

1voto

Pnj Patel Points 11

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

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

Ici, Utilisateur est le nom de la ressource et Profil est le nom du modèle. Nous vous remercions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X