1

我的系统中有表格。

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

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

控制器

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 为技术类别撰写的所有文章。(类别名称必须在结果中,并且在类别表中,并且对于条件,您可以使用在文章表中的 category_id

4

2 回答 2

2

像这样的东西应该工作:

$technologyArticles = Articles::where('student_id', '=', $students_id)->where('category_id', '=', $categories_id)->get();
于 2017-09-01T10:51:42.707 回答
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 可以在查询父模型时“预先加载”关系。

有时您可能希望预先加载关系,但也为预先加载查询指定额外的查询约束。

于 2017-09-01T10:57:17.217 回答