Laravel eloquent 多个 table 加入过滤器

Laravel eloquent multiple table join with filter

我的系统中有 table 个。

  1. 学生
  2. 文章
  3. 类别

一个学生可以写多篇文章,一篇文章只属于一个学生。而一篇文章只能有一个类别。

控制器

public function all_articles_by_student_by_category(Request $request){


        $students_id = $request->students_id;
        $categories_id = $request->categories_id;


        $article_list = Students::find($students_id)->articles->all();

        //This return Something like, Select All Articles Written by Damith
    }

型号

class Students extends Model
{
    protected $fillable = ['id','first_name', 'last_name', 'age', 'created_at', 'updated_at'];

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

我想得到什么

类似于,Select Damith 为技术类别撰写的所有文章(类别名称应该在那里)

到目前为止我能做什么

类似 Select Damith 使用 $article_list = Students::find($students_id)->articles->all(); 撰写的所有文章(您可以从控制器中找到此代码)

我想从你这里得到什么

如何修改 $article_list = Students::find($students_id)->articles->all(); 以获取类似 Select Damith 撰写的技术类别的所有文章。 (类别名称必须出现在结果中,并且它在类别 table 上,对于 where 条件,您可以使用 category_id,即文章 table )

像这样的东西应该可以工作:

$technologyArticles = Articles::where('student_id', '=', $students_id)->where('category_id', '=', $categories_id)->get();

首先你到目前为止所做的在获取模型上的关系记录时不需要->all()方法,这将return 所有链接到该学生的文章:

Students::find($students_id)->articles

浏览文章模型
你可以这样做:

Article::where('student_id', $students_id)
  ->where('category_id', $category_id)->get();

这将实现您所追求的结果。


通过学生模型

如果你想通过 Students Model 你可以使用 with 方法来约束关系。

$student = Students::with(['articles' => function($query) use ($category_id) {
  $query->where('category_id', $category_id);
}])->find($student_id);

$filteredArticles = $student->articles

有用的链接

When accessing Eloquent relationships as properties, the relationship data is "lazy loaded". This means the relationship data is not actually loaded until you first access the property. However, Eloquent can "eager load" relationships at the time you query the parent model.

Sometimes you may wish to eager load a relationship, but also specify additional query constraints for the eager loading query.