我的系统中有三个表:
学生可以写很多文章,文章只属于一个学生。一篇文章只能有一个类别。
文章模型
class Articles extends Model
{
protected $fillable = ['id','title', 'body', 'students_id', 'created_at', 'updated_at'];
protected $table = 'articles';
public function students(){
return $this->belongsTo('App\Students');
}
public function categories(){
return $this->belongsTo('App\Categories');
}
}
我已经创建了上面的代码,因为我需要获得一篇文章列表,其中包含该文章所写的具有类别名称的人。
为此我在控制器中使用了$article_list = Articles::get();
,它运行得很好。
然后我再次需要获得文章列表(这次我不需要学生姓名和类别名称;文章表的输出绰绰有余)。
但是如果我使用$article_list = Articles::get();
,它还会输出与category和students表一起加入的文章表。
有没有办法使用 Eloquent 来获取文章表?
答案 0 :(得分:1)
Eloquent中的关系是急切加载的,因此您是安全的,并且类别也被加载也没有坏处。引自文档:
当访问Eloquent关系作为属性时,关系 数据是“延迟加载”。这意味着关系数据不是 实际加载,直到你第一次访问该属性。
https://laravel.com/docs/5.4/eloquent-relationships#eager-loading
答案 1 :(得分:0)
尝试:
class Articles extends Model
{
protected $fillable = ['id','title', 'body', 'students_id', 'created_at', 'updated_at'];
protected $table = 'articles';
public function students(){
return $this->belongsTo('App\Students');
}
public function categories(){
return $this->hasOne('App\Categories');
}
}
class Student extends Model
{
public function articles(){
return $this->hasMany('App\Articles');
}
}
您可以尝试有很多关系类型
官方链接:read more
答案 2 :(得分:0)
@jjj的回答是正确的,但要更详细地解释一下:
$articles = Articles::get();
将加载唯一的文章。你可以在你的控制器中像这样检查:
public function articles() {
$articles = Articles::get();
return $articles;
}
但$articles
是模型的集合,每个模型都“了解”它的关系。因此,如果您尝试访问其中一种关系,Laravel将默默地为您加载它。因此,如果您将相同的$articles
传递给您的视图(目前没有类别),然后在您的视图中执行以下操作:
@foreach ($articles as $article)
{{ $article->categories->name }}
@endforeach
它会起作用,因为Laravel正在使用SQL查找每篇文章的类别然后命名。正如@jjj所解释的那样,这称为延迟加载,并在文档中进行了描述。
顺便说一句,像这样的延迟加载通常是效率低下的,并且最好是急切加载,就像你在上面的一条评论中所显示的那样。 It is described well in the docs