【问题标题】:Property [title] does not exist on this collection instance此集合实例上不存在属性 [title]
【发布时间】:2017-05-12 23:24:37
【问题描述】:

我正在关注 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'));
}

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

我做错了什么?

【问题讨论】:

    标签: php laravel eloquent properties


    【解决方案1】:

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

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

    或者你可以通过它的索引获取对象之一:

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

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

    {{ $collection->first() }}
    

    当您使用find() 或first() 时,您将获得一个对象,因此您可以通过简单的方式获得属性:

    {{ $object->title }}
    

    【讨论】:

    • 是的,在执行 Model->get() 后获得一个包含一个对象的列表,因此总是显示数据,我无法访问。执行后 first() 然后获取对象
    • 在 4 小时搜索、阅读和测试 Laravel 文档并访问大量 StackOverflow 问题/答案之后,您是唯一一个提到 get() 检索集合的人。是你让我从椅子上跳下来,意识到我所有的问题都是正确的。问题出在“打印”上。衷心感谢您的回答!我是认真的!
    • 有史以来最好的解释
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你应该在 Controller 中使用 Collection 关键字。 喜欢这里..

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

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

      【讨论】:

        【解决方案4】:
        $about = DB::where('page', 'about-me')->first(); 
        

        代替get()。

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

        【讨论】:

        • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和/或文档链接。如果没有围绕它们的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请edit你的答案-From Review
        【解决方案5】:

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

        【讨论】:

        • 我的代码建议适用于修补程序,但不适用于项目。
        【解决方案6】:

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

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

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

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

        所以改成:

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

        【讨论】:

          【解决方案7】:

          由于$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
          

          【讨论】:

            【解决方案8】:

            about valiable 中存储的信息是集合格式,所以只需要循环遍历即可。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-11-12
              • 2019-03-23
              • 2020-07-11
              • 2018-10-12
              • 2021-02-08
              • 2021-12-16
              相关资源
              最近更新 更多