Laravel 4.1预加载

6
我遇到了急切加载的问题。 假设我有成员、培训类别、培训类别结果和注册模型。
成员模型:
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');
}

培训类别模型:
public function trainings() {
    return $this->hasMany('Training', 'id');
}
public function trainingCategoryResults() {
    return $this->hasMany('trainingCategoryResult', 'category_id');
}

培训类别结果模型:
  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,有没有办法做到这一点?
以下是我目前的代码:
 $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']);

谢谢你。

我不确定我是否正确理解了这个问题,但是为什么你不能只是加入呢?就像 Member::with('categoryResult')->with('registration')->get() 或者 Member::with(array('categoryResult', 'registration'))->get() (这是伪代码,不确定它会如何工作) - mmmm
这个能用吗?Registration::with('member.trainingCategoryResults')->get(); - Torgheh
2个回答

0
你可以使用几个选项来实现这个目标: 选项1:创建一个变量关系
在Member模型中更改你的关系。
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


0

这个不会起作用 Member::with('categoryResult')->with('registration')->get()

你可以在Member模型中创建一个新的关联

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

//然后调用

Member::with('categoryResult')->get();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接