Die Eigenschaft [title] ist für diese Sammlungsinstanz nicht vorhanden


94

Ich verfolge die Videos von Laracasts: Basic Model / Controller / View Workflow .

Ich habe eine Tabelle mit Kontaktinformationen.

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

Ich versuche, Daten mit dem folgenden Code in der Controller-Datei an die Anzeige zu übergeben:

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

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

Wenn ich versuche, den Code wie unten gezeigt anzuzeigen,

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

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

Ich erhalte eine Fehlermeldung, die besagt:

Die Eigenschaft [title] ist für diese Sammlungsinstanz nicht vorhanden. (Ansicht: E: \ laragon \ www \ newsite \ resources \ views \ about.blade.php)

Aber wenn ich die Abrufmethode in der Controller-Datei ändere, funktioniert es.

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

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

Wenn ich dd($about)im ersten Fall ( where()->get()) verwende, werden die Daten von einem Array gekapselt. Im zweiten Fall ( find(3)) werden die Daten wie erwartet angezeigt.

Was mache ich falsch?

Antworten:


232

Wenn Sie verwenden, erhalten get()Sie eine Sammlung . In diesem Fall müssen Sie darüber iterieren, um Eigenschaften zu erhalten:

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

Oder Sie können einfach eines der Objekte anhand seines Index abrufen:

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

Oder holen Sie sich das erste Objekt aus der Sammlung:

{{ $collection->first() }}

Wenn Sie ein Objekt verwenden find()oder first()erhalten , können Sie Eigenschaften mit einfachen:

{{ $object->title }}

Ja, nach dem Ausführen von Model-> get () erhalten Sie eine Liste mit einem Objekt. Aus diesem Grund werden immer Daten angezeigt, und ich kann nicht darauf zugreifen. Nach exexute zuerst () dann Objekt bekommen
Rubén Ruíz

1
Nach 4 STUNDEN des Suchens, Lesens und Testens der Laravel-Dokumentation und des Besuchs vieler Fragen / Antworten von StackOverflow waren Sie der einzige, der erwähnte, dass get () eine Sammlung abruft. Sie haben mich vom Stuhl springen lassen und festgestellt, dass alle meine Fragen richtig waren. Das Problem war auf dem "Druck". Aus tiefstem Herzen ein großes Dankeschön für diese Antwort! Ich meine es ernst!
Grinnex.

22

Mit der get()Methode erhalten Sie eine Sammlung (alle Daten, die mit der Abfrage übereinstimmen). Versuchen Sie first()stattdessen, sie zu verwenden . Sie gibt nur ein Element zurück, wie folgt:

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

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

anstelle von get() .

Es funktioniert bei meinem Projekt . Vielen Dank.


3
Dies könnte zwar die Frage des Autors beantworten, es fehlen jedoch einige erklärende Wörter und / oder Links zur Dokumentation. Raw-Code-Schnipsel sind ohne einige Ausdrücke nicht sehr hilfreich. Möglicherweise ist es auch sehr hilfreich , eine gute Antwort zu schreiben . Bitte bearbeiten Sie Ihre Antwort - Aus Bewertung
Nick

1

Sie sollten das Schlüsselwort Collection in Controller verwenden. Wie hier..

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

Hier ist Benutzer Ressourcenname und Profil Modellname. Vielen Dank.


1

Eine Person kann dies während der Arbeit mit Factory-Funktionen erhalten, sodass ich bestätigen kann, dass dies eine gültige Syntax ist:

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

Möglicherweise wird der Fehler der Sammlungsinstanz angezeigt, wenn Sie Folgendes tun:

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

Ändern Sie es also in:

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

0

$about->first()->idoder $stm->first()->titleund Ihr Problem ist gelöst.


Mein Code-Vorschlag funktioniert beim Basteln, aber nicht beim Projekt.
Onyash Ed
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.