Laravel Eloquent中的一对多关系给出了未定义的方法

时间:2016-01-30 10:48:23

标签: laravel laravel-5 eloquent laravel-5.1

在定义与两个模型(学生和入学)的一对多关系时,我遇到了上述问题。使用以下方法从另一个表访问表时

$enrollment = App\Enrollment::first();
$enrollment->students()->first_name;

我得到了:

Illuminate\Database\QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'students.enrollment_id' in 'where clause' (SQL: select * from `students` where `students`.`enrollment_id` = 1 and `students`.`enrollment_id` is not null)'

但是当我使用时:

 $enrollment = App\Enrollment::first();
 $enrollment->students()->first_name;

我得到了:

PHP error:  Undefined property: Illuminate\Database\Eloquent\Relations\HasMany::$first_name on line 1

有人可以帮我吗?

注册

protected $fillable = [
    'subject_code',
    'subject_description',
    'section',
    'schedule',
    'room_no',
    'no_of_units'
];

public function students()
{
    return $this->hasMany('App\Student');
}

学生

protected $fillable = [
    'enrollments_id',
    'student_no',
    'first_name',
    'last_name',
    'middle_name',
    'birthdate',
    'fathers_name',
    'mothers_name',
    'phone_no',
    'degree_id',
    'city_id',
    'address'
];

public function enrollment()
{
    return $this->belongsTo('App\Enrollment');
}

这里是学生和相应报名表

Schema::create('students', function (Blueprint $table) {
            $table->increments('id')->unsigned();
            $table->integer('enrollments_id')->unsigned();
            $table->integer('student_no');

            $table->foreign('enrollments_id')->references('id')->on('enrollments')->unsigned();
            $table->string('first_name');
            $table->string('last_name');
            $table->string('middle_name');
            $table->date('birthdate');
            $table->string('fathers_name');
            $table->string('mothers_name');
            $table->string('phone_no');
            $table->string('address');
            $table->integer('city_id');
            $table->integer('degree_id');
            $table->timestamps();
        });
Schema::create('enrollments', function (Blueprint $table) {
        $table->increments('id');
        $table->string('subject_description');
        $table->string('subject_code');
        $table->time('schedule');
        $table->string('room_no');
        $table->integer('no_of_units');
        $table->string('section');
        $table->timestamps();
    });

3 个答案:

答案 0 :(得分:0)

首先,你想要什么 根据你的问题,我假设你想要注册有很多学生,对于这种关系,你需要在学生表中注册enid_id而不是在注册表中的student_id。 之后使用

$students= Enrolment::find(id)->students;

它将返回所有具有所需注册ID的学生

答案 1 :(得分:0)

这是正常的,因为您尝试从first_name对象获取属性hasMany,如果您想要获取get()个对象(在您的对象中),则应使用Collection方法案例集合students):

$enrollment->students()->get();

如果你想获得名字,你应该指定你想从中得到first_name的对象,例如:

$enrollment->students()->first()->first_name;
$enrollment->students()->last()->first_name;

如果您想获取所有first_name的{​​{1}}属性,请使用students方法,例如:

lists

输出:收集所有学生的名字。

希望这有帮助。

更新 尝试删除$enrollment->students()->lists('first_name');

->unsigned()

以及:

$table->increments('id')->unsigned();

答案 2 :(得分:0)

当您在一个雄辩的对象上调用关系时,它实际上会返回关系而不是确切的对象

例如:在你的情况下 $ enrollment-> students()将返回该关系 在哪里 $ enrollment->学生将返回雄辩的对象(属于,有一个关系)和雄辩的对象/对象的集合/数组(在一对多,多对多的关系中)

如果您将其用作属性,只要将其作为函数调用,您将获得实际结果和关系查询

即使您获得了关系,也可以通过调用get on the

来获得结果

$ enrollment->学生() - >得到()