Laravel 4.1急切加载

时间:2015-05-20 11:23:51

标签: php laravel-4 eager-loading

我在急切的装载上遇到了麻烦。 我们说我有会员模型,TrainingCategory,TrainingCategoryResult和Registration

会员模特:

public function registration() {
    return $this->hasMany('Registration', 'member_id');
}
public function trainingResults(){
    return $this->hasMany('trainingResult', 'member_id');
}
public function trainingCategoryResults() {
  return $this->hasMany('TrainingCategoryResult', 'member_id');
}

TrainingCategory模型:

public function trainings() {
    return $this->hasMany('Training', 'id');
}
public function trainingCategoryResults() {
    return $this->hasMany('trainingCategoryResult', 'category_id');
}

TraningCategoryResult模型:

  public function category() {
        return $this->belongsTo('TrainingCategory', 'id');
  }
  public function member() {
        return $this->belongsTo('Member', 'id');
  }

注册模式:

  public function course() {
    return $this->belongsTo('Course', 'course_id');
  }
  public function member() {
    return $this->belongsTo('Member', 'id');
  }

我正在尝试加载所有注册信息及其相关信息,包括TraningCategoryResult信息,但我不知道如何获得需要两个外键(category_id和member_id)的TraningCategoryResult,有没有办法做到这一点? / p>

这是我的代码atm:

 $members= Member::where(function($query) use ($id, $site) {
    $query
    ->where('id', '=', $id)
    ->where('site', '=', $site);
  });

 $members= $members
  ->with('registration.course',
  'registration.course.traningCategories',
  ->get(['member.id']);

谢谢。

2 个答案:

答案 0 :(得分:0)

这将无法使用Member :: with('categoryResult') - > with('registration') - > get()

您可以在会员模型中建立新关系

public function categoryResult()
{
    return $this->belongsTo('Category')->with('Registration');
}

//然后调用

会员::与( 'categoryResult') - >得到();

答案 1 :(得分:0)

您可以使用一些选项来实现这一目标:

选项1 :创建变量关系

在会员模型中更改您的关系

public function trainingCategoryResults($category_id = null) {
  if(empty($category_id))
    return $this->hasMany('TrainingCategoryResult', 'member_id');
  else
    return $this->hasMany('TrainingCategoryResult', 'member_id')
      ->where('category_id', $category_id);
}

上面的代码可能有局限性,并没有利用许多laravel功能,但它可以工作。

选项2:从关系访问

您可以按原样保存所有内容,并按以下方式加载:

$members= Member::where(function($query) use ($id, $site) {
  $query
    ->where('id', '=', $id)
    ->where('site', '=', $site);
})
->where('id', $member_id) // set the id of the memeber
->with(array(
  'traningCategoryResults' => function($q)use($category_id){
    $q->where('category_id', $category_id); // This makes sure you get only desired results
  }
))

通过这种方式,假设您知道$ category_id

,那么您将只拥有所需的内容