【问题标题】:Laravel 5.8: Trying to get property 'created_at' of non-objectLaravel 5.8:试图获取非对象的属性“created_at”
【发布时间】:2021-10-01 13:34:59
【问题描述】:

我正在使用 Laravel 5.8 开发我的项目,在这个项目中,Member Model 和 Student Model 之间存在 OneToMany 关系,如下所示:

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时间戳呢?

【问题讨论】:

    标签: php laravel laravel-5.8


    【解决方案1】:

    抛出“非对象错误”的可能性有很多。

    首先,确保您已经在Student 模型中添加了主键。

    protected $primaryKey = 'std_id';

    其次,如果你在find()方法中传递了错误的$student->mbr_id并直接访问特定的列会抛出错误:

    请检查您的刀片文件是否存在记录:

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

    希望你能理解并解决。

    【讨论】:

    【解决方案2】:

    为什么不利用 Eloquent 动态关系属性(参见 https://laravel.com/docs/8.x/eloquent-relationships#one-to-many-inverse)并使用

    $student->member->created_at
    

    【讨论】:

      【解决方案3】:

      find() 与主键一起使用,在本例中为 std_id。所以要与另一个领域合作,你应该这样做

      $customs->where('std_mbr_id', $student->mbr_id)->first()->created_at
      

      【讨论】:

        猜你喜欢
        • 2019-12-31
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多