将eloquent关系转换为vue js代码

时间:2016-05-18 02:33:03

标签: laravel laravel-5 laravel-5.1 vue.js vue-resource

我有这个项目应该从数据透视表和一对多关系中获取值。当使用雄辩的语法时,我得到正确的输出,如下所示:

ReservationController

@inject('reservation', 'App\Http\Controllers\ReservationController')
@foreach( $reservation->index() as $reserved )
<tr>
  <td>{{ $reserved->section->section_code }}</td>
  <td>{{ $reserved->subject->subject_code }}</td>
  <td>{{ $reserved->subject->subject_description }}</td>
  <td>{{ $reserved->schedule }}</td>
  <td>{{ $reserved->subject->units }}</td>
  <td>{{ $reserved->room_no }}</td>
  <td>
    <button class="btn btn-xs btn-danger">Delete</button>
  </td>
</tr>
@endforeach

form.blade.php

new Vue({
el: '#app-layout',

data: {

    subjects: []

},
ready: function(){
    this.fetchSubjects();
},
methods:{

    fetchSubjects: function(){
        var self = this;

        this.$http({
            url: 'http://localhost:8000/reservation',
            method: 'GET'
        }).then(function (subjects){
            self.subjects = subjects.data;
            console.log('success');
        }, function (response){
            console.log('failed');
        });
    },

}
});

但是我想利用vue js的功能,以便我的页面将自动填充值,如下所示。

<tr v-for="subject in subjects">
  <td>@{{ subject.section.section_code }}</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td>@{{ subject.room_no }}</td>
  <td>
     <button class="btn btn-xs btn-danger">Delete</button>
  </td>
</tr>

form.blade.php

class SectionSubject extends Model
{
    protected $table = 'section_subject';

    public function students()
    {
        return $this->belongsToMany(Student::class, 'section_subject_student','section_subject_id','student_id'
            )->withTimestamps();
    }

    public function assignStudents(Student $student)
    {
        return $this->students()->save($student);
    }

    public function subject()
    {
        return $this->belongsTo(Subject::class);
    }

    public function section()
    {
        return $this->belongsTo(Section::class);
    }

}

从我的form.blade.php中可以看出,我无法获得section_code的值。我在这里错过了什么吗?

更新: SectionSubject Model

public function sectionSubjects()
     {
        return $this->belongsToMany(SectionSubject::class,'section_subject_student', 'student_id','section_subject_id')
        ->withTimestamps();
     }

学生模特

class Section extends Model
{
    public function subjects()
    {
        return $this->belongsToMany(Subject::class)->withPivot('id','schedule','room_no');
    }

    public function sectionSubjects()
    {
        return $this->hasMany(SectionSubject::class);
    }
}

部分模型

{{1}}

1 个答案:

答案 0 :(得分:2)

这不是laravel或vuejs的问题。

此代码。

    this.$http({
        url: 'http://localhost:8000/reservation',
        method: 'GET'
    }).then(function (subjects){
        self.subjects = subjects.data;
        console.log('success');
    }, function (response){
        console.log('failed');
    });

你可以看到这个ajax请求会在json中得到答案。

和json几乎是静态内容。因为php范围内的“Eloquent”是一个对象,所以如果你从它那里询问关系数据,它会执行调用并返回它的关系数据,但是json不能这样做。

所以为了使它工作,你需要转换整个关系数据并创建一个大型数组,它保存所有关系数据,然后对其进行编码。

例如:

$user = App\User::with('roles')->first();
return $user->toJson();

现在如果你返回它,它将包含“user.roles.name”这个值,因为我们急切地加载并转换为json。

在你的情况下:

$subjects = App\Reservation::with('section')->all(); 
return $subjects->toJson();

现在你可以使用主题并将其循环“subject.section.section_code”,因为部分被急切加载并添加到数组并转换为json。

我希望这能解决你的问题。