此集合实例上不存在属性[title]

zka*_*oca 67 php laravel laravel-eloquent

我正在关注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
Run Code Online (Sandbox Code Playgroud)

我试图使用控制器文件中的以下代码将数据传递给视图:

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

    return view('about', compact('about'));
}
Run Code Online (Sandbox Code Playgroud)

当我尝试显示如下所示的代码时,

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

@section('content')
    {!! $about->content !!}
@stop
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

此集合实例上不存在属性[title].(查看:E:\ laragon\www \newsite\resources\views\about.blade.php)

但是如果我在控制器文件中更改检索方法,它就可以工作.

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

    return view('about', compact('about'));
}
Run Code Online (Sandbox Code Playgroud)

当我dd($about)在第一个case(where()->get())中使用时,数据由数组封装.在第二种情况(find(3))中,它按预期显示数据.

我究竟做错了什么?

Ale*_*nin 170

当你使用时,get()你会得到一个集合.在这种情况下,您需要迭代它以获取属性:

@foreach ($collection as $object)
    {{ $object->title }}
@endforeach
Run Code Online (Sandbox Code Playgroud)

或者你可以通过它的索引得到一个对象:

{{ $collection[0]->title }}
Run Code Online (Sandbox Code Playgroud)

或者从集合中获取第一个对象:

{{ $collection->first() }}
Run Code Online (Sandbox Code Playgroud)

当您使用find()first()获得对象时,您可以通过简单获取属性:

{{ $object->title }}
Run Code Online (Sandbox Code Playgroud)

  • 经过 4 个小时的搜索、阅读和测试 Laravel 文档并访问大量 StackOverflow 问题/答案后,您是唯一提到 get() 检索集合的人。是你让我从椅子上跳了起来,并意识到我所有的疑问都是正确的。问题出在“打印”上。从心底里,非常感谢您的回答!我真心的! (11认同)
  • 是的,执行 Model->get() 后获得一个包含一个对象的列表,因此总是显示数据,但我无法访问该数据。执行first()后获取对象 (2认同)

Ale*_*lex 20

使用get()方法获得一个集合(所有与查询匹配的数据),尝试使用first()它,它只返回一个元素,如下所示:

 $about = Page::where('page', 'about-me')->first();
Run Code Online (Sandbox Code Playgroud)


agm*_*984 5

人们在使用工厂函数时可能会遇到这种情况,所以我可以确认这是有效的语法:

$user = factory(User::class, 1)->create()->first();
Run Code Online (Sandbox Code Playgroud)

如果您执行以下操作,您可能会看到集合实例错误:

$user = factory(User::class, 1)->create()->id;
Run Code Online (Sandbox Code Playgroud)

所以将其更改为:

$user = factory(User::class, 1)->create()->first()->id;
Run Code Online (Sandbox Code Playgroud)