我正在关注 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:\larragon\www 电子网站 资源查看bout.blade.php)
但是如果我更改控制器文件中的检索方法,它就可以工作。
public function index()
{
$about = Page::find(3);
return view('about', compact('about'));
}
当我在第一种情况(
dd($about)
)中使用where()->get()
时,数据被数组封装。在第二种情况 (find(3)
) 中,它按预期显示数据。
我做错了什么?
当您使用
get()
时,您会得到一个集合。在这种情况下,您需要迭代它来获取属性:
@foreach ($collection as $object)
{{ $object->title }}
@endforeach
或者您可以通过索引获取其中一个对象:
{{ $collection[0]->title }}
或者从集合中获取第一个对象:
{{ $collection->first() }}
当你使用
find()
或 first()
时,你会得到一个 object,因此你可以通过简单的方法获取属性:
{{ $object->title }}
使用
get()
方法你会得到一个集合(与查询匹配的所有数据),尝试使用 first()
代替,它只返回一个元素,如下所示:
$about = Page::where('page', 'about-me')->first();
一个人在使用工厂函数时可能会得到这个,所以我可以确认这是有效的语法:
$user = factory(User::class, 1)->create()->first();
如果您执行以下操作,您可能会看到集合实例错误:
$user = factory(User::class, 1)->create()->id;
所以将其更改为:
$user = factory(User::class, 1)->create()->first()->id;
你可以尝试使用first()代替方法get()
$about = DB::where('page', 'about-me')->first();
您应该在控制器中使用 Collection 关键字。 就像这里..
public function ApiView(){
return User::collection(Profile::all());
}
这里,User 是资源名称,Profile 是模型名称。 谢谢你。
$about->first()->id
或
$stm->first()->title
,您的问题已解决。
由于
$about = Page::where('page', 'about-me')->get()
是一个 Laravel 集合,您可以使用 pluck()
方法获取特定属性,如 title,该方法在 https://laravel.com/docs/master/collections#method-pluck 中描述.
$titles = $about->pluck( 'title' )
@foreach($titles as $title)
{{ $title }}
@endforeach
关于valiable中存储的信息是集合格式的,所以你只需要循环遍历即可。
@if(count($about))
@foreach($about as $page)
{{$page->title}}
@endforeach
@endif