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

时间:2016-12-28 16:32:04

标签: php laravel laravel-eloquent

我正在关注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

我收到的错误是:

  

此集合实例上不存在属性[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)),它按预期显示数据。

我做错了什么?

7 个答案:

答案 0 :(得分:148)

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

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

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

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

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

{{ $collection->first() }}

当您使用find()first()时,您会获得对象,因此您可以轻松获取属性:

{{ $object->title }}

答案 1 :(得分:15)

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

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

答案 2 :(得分:1)

您应该在Controller中使用Collection关键字。 就像这里。

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

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

答案 3 :(得分:1)

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

代替 get()

它适用于我的项目。谢谢。

答案 4 :(得分:0)

$about->first()->id$stm->first()->title,您的问题就解决了。

答案 5 :(得分:0)

一个人在使用工厂功能时可能会得到这个,所以我可以确认这是有效的语法:

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

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

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

因此将其更改为:

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

答案 6 :(得分:0)

由于 $about = Page::where('page', 'about-me')->get() 是一个 Laravel 集合,因此您可以使用 https://laravel.com/docs/master/collections#method-pluck 中描述的 pluck() 方法获取像 title 这样的特定属性。

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

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