Свойство [название] не существует в этом экземпляре коллекции

95

Я слежу за видео Laracasts: Basic Model / Controller / View Workflow .

У меня есть таблица с контактной информацией.

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

Я получаю сообщение об ошибке:

Свойство [название] не существует в этом экземпляре коллекции. (Вид: 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)) он отображает данные, как и ожидалось.

Что я делаю не так?

Zkanoca
источник

Ответы:

233

Когда вы используете, get()вы получаете коллекцию . В этом случае вам нужно перебрать его, чтобы получить свойства:

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

Или вы можете просто получить один из объектов по его индексу:

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

Или получите первый объект из коллекции:

{{ $collection->first() }}

Когда вы используете find()или first()получаете объект , вы можете получить свойства с помощью простых:

{{ $object->title }}
Алексей Мезенин
источник
да, после выполнения Model-> get () получить список с одним объектом, по этой причине всегда показывать данные, и я не могу получить к ним доступ. После выполнения сначала () затем получить объект
Рубен Руис
2
После 4 ЧАСОВ поиска, чтения и тестирования документации Laravel и посещения МНОГО вопросов / ответов StackOverflow, вы единственный, кто упомянул, что get () извлекает коллекцию. Это ты заставил меня вскочить со стула и понять, что все мои вопросы были правильными. Проблема была в "печати". От всего сердца большое спасибо за этот ответ! Я действительно серьезно!
Гриннекс.
22

С помощью get()метода вы получаете коллекцию (все данные, соответствующие запросу), попробуйте использовать first()вместо этого, он возвращает только один элемент, например:

 $about = Page::where('page', 'about-me')->first();
Alex
источник
2
$about = DB::where('page', 'about-me')->first(); 

вместо get() .

Это работает над моим проектом . Спасибо.

Фантих
источник
3
Хотя это может ответить на вопрос авторов, в нем отсутствуют некоторые поясняющие слова и / или ссылки на документацию. Фрагменты необработанного кода не очень полезны без некоторых фраз. Вы также можете найти очень полезным, как написать хороший ответ . Пожалуйста, отредактируйте свой ответ - Из обзора
Ник
1

Вы должны использовать ключевое слово Collection в контроллере. Как здесь..

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

Здесь Пользователь - это имя ресурса, а профиль - это имя модели. Спасибо.

Pnj Patel
источник
1

Человек может получить это при работе с заводскими функциями, поэтому я могу подтвердить, что это действительный синтаксис:

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

Вы можете увидеть ошибку экземпляра коллекции, если сделаете что-то вроде:

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

так что измените его на:

$user = factory(User::class, 1)->create()->first()->id;
agm1984
источник
0

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

Оняш Эд
источник
Мое предложение кода работает с мастером, но не с проектом.
Оняш Эд 05