如何通过Laravel Eloquent获得一张桌子

时间:2017-09-01 11:26:48

标签: php laravel laravel-5 laravel-eloquent

我的系统中有三个表:

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

    文章模型

    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 来获取文章表?

3 个答案:

答案 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