Laravel通过过滤器

时间:2017-09-01 10:36:51

标签: php laravel laravel-5 laravel-eloquent laravel-5.5

我的系统中有这些表。

  1. 学生
  2. 文章
  3. 类别
  4. 学生可以写很多文章,文章只属于一个学生。一篇文章只能有一个类别。

    控制器

    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');
        }
    }
    

    我想要的是什么

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

    到目前为止,我能做些什么

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

    我想要的是什么

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

2 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

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

答案 1 :(得分:2)

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

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

有用的链接

  

当访问Eloquent关系作为属性时,关系数据是“延迟加载”。这意味着在您首次访问该属性之前,实际上不会加载关系数据。但是,Eloquent可以在您查询父模型时“急切加载”关系。

  

有时您可能希望加载关系,但也为热切加载查询指定其他查询约束。