Livewire 关系船不适用于 属性

Livewire Relation Ship not working with property

很好,如果他们帮我解决了这个问题,谢谢。实际上,我在 Laravel 中遇到了这个问题,我是 Livewire 的新手。


控制器

class ViewCourse extends Component{

public $course;

public function mount($id , $name = null , $mediaID = null){
    $this->course = course::findOrfail($id);
}

public function render(){
    return view('livewire.view-course')->extends('layouts.app');
}

关系模型

class course extends Model{

    public function teacher(){
        return $this->hasOne('App\Models\User' , 'id' , 'user_id')->select('name' , 'picture');
    }
}

Blade代码

<p>{{$course->teacher->name}}</p>

我的错误

ErrorException
Trying to get property 'name' of non-object (View: C:\xampp\htdocs\rstacode\resources\views\livewire\view-course.blade.php)

即使集合为空,您也总是尝试从对象访问 属性,这就是出现问题的原因。

总是在打印前检查集合是否有关联的关系数据。

如果你在PHP 7.*

{{ $course->teacher->name ?? '' }}

PHP 7.*

之前
{{ (isset($course->teacher->name) && !empty($course->teacher->name)) ? $course->teacher->name : '' }}

问题是您没有select输入 Laravel 正确解析关系和获取用户模型所需的列。

您可以删除 select 或将 id 列添加到您的 select:

删除 select:

public function teacher()
{
    return $this->hasOne('App\Models\User', 'id', 'user_id');
}

将所需的列添加到 select:

public function teacher()
{
    return $this->hasOne('App\Models\User', 'id', 'user_id')
        ->select([
            'id',
            'name',
            'picture',
        ]);
}

我个人会删除 select,因为我只从关系中 selecting 的几列中看不到任何价值。此外,如果您向用户添加更多列,它可能会在以后引起更多麻烦 table.

你必须做

$this->course = course::with('teacher')->findOrfail($id);

为了提前加载您的关系数据,请在此处查看文档:https://laravel.com/docs/8.x/eloquent-relationships#eager-loading-by-default