Właściwość [tytuł] nie istnieje w tej instancji kolekcji

100

Śledzę filmy Laracasts: Basic Model / Controller / View Workflow .

Mam tabelę z danymi kontaktowymi.

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

Próbuję przekazać dane do wyświetlenia przy użyciu następującego kodu w pliku kontrolera:

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

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

Kiedy próbuję wyświetlić kod, jak pokazano poniżej,

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

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

Otrzymuję błąd, który mówi:

Właściwość [tytuł] nie istnieje w tej instancji kolekcji. (Widok: E: \ laragon \ www \ newsite \ resources \ views \ about.blade.php)

Ale jeśli zmienię metodę pobierania w pliku kontrolera, to działa.

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

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

Kiedy używam dd($about)w pierwszym przypadku ( where()->get()), dane są hermetyzowane przez tablicę. W drugim przypadku ( find(3)) wyświetla dane zgodnie z oczekiwaniami.

Co ja robię źle?

zkanoca
źródło

Odpowiedzi:

243

Kiedy używasz get(), otrzymujesz kolekcję . W takim przypadku musisz powtórzyć to, aby uzyskać właściwości:

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

Lub możesz po prostu pobrać jeden z obiektów według jego indeksu:

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

Lub zdobądź pierwszy przedmiot z kolekcji:

{{ $collection->first() }}

Kiedy używasz find()lub first()otrzymujesz obiekt , możesz uzyskać właściwości za pomocą prostego:

{{ $object->title }}
Alexey Mezenin
źródło
tak, po wykonaniu Model-> get () uzyskaj listę z jednym obiektem, z tego powodu zawsze pokazuj dane i nie mam do nich dostępu. Po exexute first (), a następnie pobierz obiekt
Rubén Ruíz
4
Po 4 GODZINACH wyszukiwania, czytania i testowania dokumentacji Laravel oraz odwiedzania WIELU pytań / odpowiedzi StackOverflow, byłeś jedyną osobą, która wspomniała, że ​​get () pobiera kolekcję. To Ty sprawiłeś, że zeskoczyłem z krzesła i zdałem sobie sprawę, że wszystkie moje pytania były prawidłowe. Problem był na „wydruku”. Z całego serca dziękuję za tę odpowiedź! Naprawdę mam to na myśli!
Grinnex.
23

Dzięki get()metodzie otrzymujesz kolekcję (wszystkie dane pasujące do zapytania), spróbuj użyć first()zamiast tego, zwraca tylko jeden element, na przykład:

$about = Page::where('page', 'about-me')->first();
Alex
źródło
2
$about = DB::where('page', 'about-me')->first(); 

zamiast get() .

Działa na moim projekcie . Dzięki.

Phantih
źródło
3
Chociaż może to odpowiedzieć na pytanie autorów, brakuje w nim słów wyjaśniających i / lub linków do dokumentacji. Fragmenty surowego kodu nie są zbyt pomocne bez otaczających je fraz. Może się również okazać, że bardzo pomocne może być napisanie dobrej odpowiedzi . Proszę edytować swoją odpowiedź - Od Przeglądu
Nick
1

Należy użyć słowa kluczowego kolekcji w kontrolerze. Jak tutaj..

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

Tutaj użytkownik to nazwa zasobu, a profil to nazwa modelu. Dziękuję Ci.

Pnj Patel
źródło
1

Osoba może otrzymać to podczas pracy z funkcjami fabrycznymi, więc mogę potwierdzić, że jest to prawidłowa składnia:

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

Możesz zobaczyć błąd instancji kolekcji, jeśli zrobisz coś takiego:

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

więc zmień to na:

$user = factory(User::class, 1)->create()->first()->id;
agm1984
źródło
0

$about->first()->idlub $stm->first()->titleproblem zostanie rozwiązany.

Onyash Ed
źródło
Moja sugestia dotycząca kodu działa przy majsterkowaniu, ale nie w projekcie.
Onyash Ed