【问题标题】:Trying to get property 'column_name' of non-object while displaying data on view在视图上显示数据时尝试获取非对象的属性“column_name”
【发布时间】:2019-11-02 21:50:49
【问题描述】:

我想在我的刀片视图上显示来自关系数据的数据,但是当我尝试显示数据时,表中只包含一行数据,它显示在视图中,但是如果我在表中插入多个数据,则会出现错误。

我有三张桌子coursessectionscourse_section。在course_section 表中,这些是以下列course_idsection_id

我已经尝试过{{ $section->courses()->first()->courseTitle }}这个在stackoverflow上找到的sn-p。

我的部分型号代码:-

class section extends Model
{
  public function courses(){
    return $this->belongsToMany('App\Model\admin\course\course','course_sections','course_id');
  }
}

我的部分控制器代码:-

$sections = section::with('courses')->orderBy('id','DESC')->get();
      return view('backend.courses.section.all',compact('sections','courses'));

我的查看代码:-

@foreach ($sections as $section)
          <tr>
            <td>{{ $section->title }}</td>
            <td>{{ $section->courses()->first()->courseTitle }}</td>
          </tr>
@endforeach

我收到这个错误

“试图获取非对象的属性'courseTitle'(查看: 资源/视图/后端/课程/部分/all.blade.php)"

【问题讨论】:

标签: laravel eloquent laravel-5.8


【解决方案1】:

以下是你做错了:

  1. $section-&gt;courses() 替换为$section-&gt;courses,因为您已经在进行早期加载。而$section-&gt;courses() 会再次查询db。

  2. 检查关系数据是否存在然后显示。

所以你的代码如下:

@foreach ($sections as $section)
<tr>
    <td>{{ $section->title }}</td>
    <td>
        @php
           $course = $section->courses->first();
        @endphp

        {{ $course->courseTitle or "" }}
    </td>
</tr>
@endforeach

如果有帮助请告诉我!

已编辑:

根据对话,关系已更改为 course -&gt;hasMany -&gt; sectionssection -&gt;belongsTo -&gt; course,因此刀片也会更改。

@foreach ($sections as $section)
<tr>
    <td>{{ $section->title }}</td>
    <td>
        @php
           $course = $section->course;
        @endphp

        {{ $course->courseTitle or "" }}
    </td>
</tr>
@endforeach

【讨论】:

【解决方案2】:

部分控制器:

$sections = section::with('courses')->orderBy('id','DESC')->get();
return view('backend.courses.section.all', compact('sections'));

在视图中,您必须循环各个部分,然后循环课程并创建每一行。例如:

@foreach ($sections as $section)
    @foreach ($section->courses as $course)
          <tr>
            <td>{{ $section->title }}</td>
            <td>{{ $course->courseTitle }}</td>
          </tr>
    @endforeach
@endforeach

注意是$section->courses而不是$section->courses(),因为相关课程已经存在,不需要再查询。


更新

或者您可以通过course进行查询

$courses = course::with('sections')->get();
return view('backend.courses.section.all',compact('courses'));

在视图中:

@foreach ($courses as $course)
    @foreach ($course->sections as $section)
          <tr>
            <td>{{ $section->title }}</td>
            <td>{{ $course->courseTitle }}</td>
          </tr>
    @endforeach
@endforeach

【讨论】:

  • @porloserros 我使用了你的解决方案,但它只重复表中的第一行。
  • 所有课程的课程名称都相同?也许您应该查询模型课程及其相关部分
  • @AbhishekNimbalkar 我用另一个选项更新了答案。我不知道我是否理解您想要实现的目标
猜你喜欢
  • 1970-01-01
  • 2021-02-10
  • 2017-01-26
  • 2016-05-02
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
相关资源
最近更新 更多