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?

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 }}

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();

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

zamiast get() .

Działa na moim projekcie . Dzięki.


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.


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;

0

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


Moja sugestia dotycząca kodu działa przy majsterkowaniu, ale nie w projekcie.
— Onyash Ed
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.