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

Php 如何通过Laravel获得一张桌子,php,laravel,laravel-5,laravel-eloquent,Php,Laravel,Laravel 5,Laravel Eloquent,我的系统中有三个表: 学生 文章 类别 一个学生可以写很多文章,而一篇文章只属于一个学生。一篇文章只能有一个类别 文章模型 class Articles extends Model { protected $fillable = ['id','title', 'body', 'students_id', 'created_at', 'updated_at']; protected $table = 'articles'; public function students

我的系统中有三个表:

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

    文章模型

    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\u list=Articles::get()它还输出与类别和学生表连接的文章表


    是否有一种方法可以使用Eloquent仅获取文章表?

    Eloquent中的关系是渴望加载的,因此您是安全的,同时加载类别也不会有任何伤害。引自文件:

    当作为属性访问雄辩的关系时,关系 数据是“延迟加载的”。这意味着关系数据不可用 直到您首次访问该属性时才实际加载

    试试:

    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');
        }
    }
    
    您可以通过关系类型尝试具有多个


    官方链接:

    @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来查找每篇文章的类别,然后是名称。正如@jj所解释的,这称为延迟加载,在文档中有描述


    顺便说一句,像这样的延迟加载通常效率很低,最好是像您在上面的一条评论中所展示的那样进行快速加载

    您可以使用查询生成器进行此操作。您所说的输出文章表与类别和学生连接是什么意思?你确定你得到的结果中的学生和类别数据实际上是id,还是这些只是雄辩模型上的关系对象?@Lessugar是的。我在使用
    $articles=articles::with('students')->with('categories')->get()时得到了相同的结果
    $articles=articles::get()。我因此感到困惑。我的意思是在每次访问之后,我可以使用
    {{$article['categories']['name']}
    访问类别名称。所以我知道他们已经加入……你们能够做到这一点,因为这些关系是通过雄辩的模型传递的。如果不需要开销数据,请改用只针对特定表。但是,老实说,性能方面的差异可以忽略不计。在编写了这么多代码之后,您得到了什么::$articles=articles::with('students')->get()@我是最愚蠢的人,你的表现很好。在您首先访问属性之前,不会实际加载数据。这是快速加载的一个好处。@我最愚蠢的是,我在回答中链接的文档很好地解释了性能注意事项。如果您需要这些属性,那么快速加载可能会更好。