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()@我是最愚蠢的人,你的表现很好。在您首先访问属性之前,不会实际加载数据。这是快速加载的一个好处。@我最愚蠢的是,我在回答中链接的文档很好地解释了性能注意事项。如果您需要这些属性,那么快速加载可能会更好。