Laravel 5.8: попытка получить свойство created_at не-объекта

Я использую Laravel 5.8 для разработки своего проекта, и в этом проекте у меня есть отношение OneToMany между Member Model и Student Model следующим образом:

Student.php:

public function member()
    {
        return $this->belongsTo(Student::class, 'std_mbr_id');
    }

Member.php:

public function student()
    {
        return $this->hasOne(Student::class,'std_mbr_id');
    }

Затем в Контроллере я добавил это:

public function index()
    {
        $student = new Student();
        $students = $student->searchStudents()->paginate(20);
        $custom = new Student();
        $customs = $custom->all();
        return view('admin.students.custom', compact('students','customs'));
    }

Теперь в представлении я хочу получить временную метку created_at, например:

$customs->find($student->mbr_id)->created_at

Но это вернет эту ошибку:

Попытка получить свойство created_at не-объекта

Однако когда я делаю dd($customs->find($student->mbr_id)), я могу правильно получить отметки времени:

введите описание изображения здесь

Итак, как получить доступ к метке времени created_at в этой ситуации?


person tejoslaeslio    schedule 25.07.2021    source источник


Ответы (3)


Есть много возможностей выбросить необъектные ошибки.

Прежде всего, убедитесь, что вы добавили первичный ключ в Student Модель.

protected $primaryKey = 'std_id';

Во-вторых, если вы передали неверный $student->mbr_id в метод find() и получили прямой доступ к определенным столбцам, он выдаст ошибку:

Пожалуйста, проверьте в своем файле лезвия, существует ли запись:

@if($customs->find($student->smbr_id))
    {{ $customs->find($student->smbr_id)->created_at }}
@endif

Надеюсь, вы ее поймете и решите.

person Amit Senjaliya    schedule 31.07.2021
comment
Привет, парень, я только что столкнулся с новой проблемой, не могли бы вы помочь мне: stackoverflow.com/questions/68601648/ - person tejoslaeslio; 31.07.2021
comment
В предложенном вами комментарии есть тип, где скобка должна быть после smbr_id, а не после created_at - person Danny Van Der Sluijs; 05.08.2021
comment
@DannyVanDerSluijs Да, это синтаксическая ошибка. Я обновил это - person Amit Senjaliya; 06.08.2021

Почему бы не использовать свойство динамических отношений Eloquent (см. https://laravel.com/docs/8.x/eloquent-relationships#one-to-many-inverse) и используйте

$student->member->created_at
person Danny Van Der Sluijs    schedule 05.08.2021

find() работает с первичным ключом, которым в данном случае является std_id. Итак, чтобы работать с другим полем, вы должны сделать

$customs->where('std_mbr_id', $student->mbr_id)->first()->created_at
person aphoe    schedule 07.08.2021