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

我在关注 Laracast 的视频: 基本模型/控制器/视图工作流

我有一张桌子,里面有联系方式。

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

我尝试使用控制器文件中的以下代码将数据传递到 view:

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 ]

但是如果我更改控制器文件中的检索方法,它就会工作。

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


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

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

我做错了什么?

430119 次浏览

当你使用 get()时,你会得到一个 收藏品。在这种情况下,你需要遍历它来得到属性:

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

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

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

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

\{\{ $collection->first() }}

当你使用 find()或者 first()时,你会得到一个 对象,所以你可以用简单的:

\{\{ $object->title }}

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

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

应在控制器中使用 Collection 关键字。 比如这里。

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

在这里,用户是资源名称,配置文件是模型名称。 谢谢你。

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

而不是 get()

它工程在我的项目 。谢谢。

$about->first()->id或 你的问题解决了。

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

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

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

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

那就改成:

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

由于 $about = Page::where('page', 'about-me')->get()是一个幼虫的集合,你可以使用 pluck()方法得到一个特定的属性,比如 书名,这在 https://laravel.com/docs/master/collections#method-pluck中有描述。

$titles = $about->pluck( 'title' )


@foreach($titles as $title)
\{\{ $title }}
@endforeach

以 about valable 格式存储的信息是集合格式的,所以您只需要循环访问它。

@if(count($about))
@foreach($about as $page)
\{\{$page->title}}
@endforeach
@endif