Властивість [title] не існує в цьому екземплярі колекції


95

Я стежу за відео Laracasts: Базова модель / Контролер / Перегляд робочого процесу .

У мене в таблиці є контактна інформація.

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

Я намагаюся передати дані для перегляду, використовуючи такий код у файлі контролера:

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

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

Коли я намагаюся показати код, як показано нижче,

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

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

Я отримую повідомлення про помилку:

Властивість [title] не існує в цьому екземплярі колекції. (Перегляд: E: \ laragon \ www \ newsite \ resources \ views \ about.blade.php)

Але якщо я змінив метод отримання у файлі контролера, це спрацює.

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

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

Коли я використовую dd($about)в першому випадку ( where()->get()), дані інкапсулюються масивом. У другому випадку ( find(3)) він відображає дані, як очікувалося.

Що я роблю не так?

Відповіді:


234

Коли ви використовуєте, get()ви отримуєте колекцію . У цьому випадку вам потрібно перейти його, щоб отримати властивості:

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

Або ви можете просто отримати один з об’єктів за його індексом:

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

Або отримати перший об’єкт з колекції:

{{ $collection->first() }}

Коли ви використовуєте find()або first()отримуєте об’єкт , то ви можете отримати властивості за допомогою простих:

{{ $object->title }}

так, після виконання Model-> get () отримати список з одним об'єктом, з цієї причини завжди показувати дані, і я не можу отримати до них доступ. Після екзекуції спочатку (), потім отримайте об'єкт
Рубен Руїз,

2
Після 4 ГОДИН пошуку, читання та тестування документації Laravel та відвідування БАГАТО запитань / відповідей StackOverflow, ви єдиний, хто згадав, що get () отримує колекцію. Це ти змусив мене зістрибнути зі стільця і ​​зрозуміти, що всі мої запитання були правильними. Проблема була в "друку". Від щирого серця, велике спасибі за цю відповідь! Я справді це маю на увазі!
Grinnex.

22

За допомогою get()методу ви отримуєте колекцію (всі дані, що відповідають запиту), спробуйте використати first()замість неї, вона повертає лише один елемент, наприклад:

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

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

замість get() .

Це працює за моїм проектом . Дякую.


3
Незважаючи на те, що це може відповісти на питання авторів, у ньому відсутні деякі пояснювальні слова та / або посилання на документацію. Фрагменти необробленого коду не дуже корисні без деяких фраз навколо них. Ви також можете виявити дуже корисним написання хорошої відповіді . Будь ласка, відредагуйте свою відповідь - З огляду
Нік,

1

Вам слід використовувати ключове слово Collection у Controller. Як тут ..

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

Тут користувач - це ім'я ресурсу, а профіль - ім'я моделі. Дякую.


1

Людина може отримати це під час роботи із заводськими функціями, тому я можу підтвердити, що це правильний синтаксис:

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

Ви можете побачити помилку екземпляра колекції, якщо зробите щось на зразок:

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

тому змініть його на:

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

0

$about->first()->idабо $stm->first()->titleі ваша проблема розібрана.


Моя пропозиція коду працює на тинкер, але не на проект.
Onyash Ed
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.