Система связи Livewire не работает со свойством

#laravel #laravel-livewire

#laravel #laravel-livewire

Вопрос:

Доброго времени суток, спасибо, если они помогут мне с этой проблемой. На самом деле у меня такая проблема в 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('AppModelsUser' , 'id' , 'user_id')->select('name' , 'picture');
    }
}
  

Блейд-код

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

Моя ошибка

 ErrorException
Trying to get property 'name' of non-object (View: C:xampphtdocsrstacoderesourcesviewslivewireview-course.blade.php)
  

Комментарии:

1. Не могли бы вы проверить, работает ли это, если вы удалите select ->select('name' , 'picture') из отношения

2. @Remul, спасибо, это работает!

Ответ №1:

Проблема в том, что вы не выбираете столбцы, которые необходимы Laravel для правильного разрешения отношений и извлечения пользовательской модели.

Вы можете либо удалить select, либо добавить id столбец в свой select:

Удаление выбора:

 public function teacher()
{
    return $this->hasOne('AppModelsUser', 'id', 'user_id');
}
  

Добавьте необходимые столбцы в поле выбора:

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

Я бы лично просто удалил select, поскольку не вижу никакого значения в выборе только нескольких столбцов из отношения. Кроме того, это, вероятно, вызовет больше головной боли позже, если вы добавите больше столбцов в таблицу user.

Ответ №2:

Вы должны сделать

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

для того, чтобы быстро загрузить данные о ваших отношениях, взгляните на документ здесь: https://laravel.com/docs/8.x/eloquent-relationships#eager-loading-by-default

Ответ №3:

Вы всегда пытаетесь получить доступ к свойству из объекта, даже если коллекция пуста, вот почему возникает проблема.

Всегда проверяйте, имеет ли коллекция связанные реляционные данные перед печатью.

Если вы в PHP 7.*

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

До PHP 7.*

 {{ (isset($course->teacher->name) amp;amp; !empty($course->teacher->name)) ? $course->teacher->name : '' }}