【问题标题】:Laravel 4.1 eager loadingLaravel 4.1 急切加载
【发布时间】:2015-05-20 11:23:51
【问题描述】:

我在急切加载时遇到问题。 假设我有 Member、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,有什么办法吗?

这是我的自动取款机代码:

 $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() (它的伪代码,不知道它是如何工作的)
  • 这行得通吗? Registration::with('member.trainingCategoryResults')->get();

标签: php laravel-4 eager-loading


【解决方案1】:

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

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

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

//然后调用

会员::with('categoryResult')->get();

【讨论】:

    【解决方案2】:

    您可以使用几个选项来实现:

    选项 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,这样你将只拥有你需要的东西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-13
      • 2021-04-23
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2013-05-28
      • 1970-01-01
      相关资源
      最近更新 更多