Laravel Eloquent 用于显示主题表中的行?

Posted

技术标签:

【中文标题】Laravel Eloquent 用于显示主题表中的行?【英文标题】:Laravel Eloquent for display row from subject table? 【发布时间】:2015-12-25 17:32:58 【问题描述】:

我有三个数据库表

    类别(ID、名称) subcategory (id,name,category_id) foreign_key category_id on table category(id)。 subject(id,name,subcategory_id) 表子类别 (id) 上的 foreign_key subcategory_id。

我想要一行包含以下内容 -

subject_id subject_name category_name subcategory_id

如何使用 eloquent 来做到这一点。如果方法是错误的。请提出一个好的方法来实现同样的目标。

【问题讨论】:

你能把你的代码贴出来吗? 我不能在这里发布大代码,现在我用它来显示子类别 $subcategory= Subcategory::with('category')->get(); public function category() return $this->belongsTo('App\Category'); . 【参考方案1】:

假设您有以下模型:

// Category Model
class Category extends \Eloquent 
  protected $table = "category";
  public function subcategory()
    $this->hasMany('Subcategory','category_id');
  


// Subcategory Model
class Subcategory extends \Eloquent 
  protected $table = "subcategory";
  public function category()
    $this->belongsTo('Category', 'category_id');
  
  pubic function subject()
    $this->hasMany('Subject', 'subcategory_id');
  


// Subject model
class Subject extends \Eloquent 
  protected $table = "subject";
  public function subcategory()
    $this->belongsTo('Subcategory','subcategory_id');
        

您可以按如下方式获取控制器中的数据:

// for subject with id 1
public function getOneRow()
  $subject = Subject::with('subcategory.category')->findOrFail(1);
  //subject_id = $subject->id
  //subject_name = $subject->name
  //subcategory_id = $subject->subcategory->id
  //category_name = $subject->subcategory->category->name
  return array("subject_name"=>$subject->name, "category_name"=>$subject->subcategory->id, "subcategory_name"=>$subject->subcategory->category->name);


// for all subjects
public function getOneRow()
  $subjects = Subject::with('subcategory.category')->all();
  $out = array();
  foreach($subjects as $subject)
  // each row
  //subject_id = $subject->id
  //subject_name = $subject->name
  //subcategory_id = $subject->subcategory->id
  //category_name = $subject->subcategory->category->name
    $out[] = array("subject_name"=>$subject->name, "category_name"=>$subject->subcategory->id, "subcategory_name"=>$subject->subcategory->category->name);
  
  return $out;

为 Laravel 5.1 编辑 您的模型将有不同的定义。这是一个例子。或关注docs:

// Category Model Laravel 5.1
use Illuminate\Database\Eloquent\Model;
class Category extends Model 
  protected $table = "category";
  public function subcategory()
    $this->hasMany('Subcategory','category_id');
  

编辑:按照评论中的要求使用返回语句完成功能

【讨论】:

原文基于 Laravel 4.2。我添加了一个部分来显示 Laravel 5.1 中所需的潜在更改 $subject=Subject::with('subcategoryup.category')->findOrFail(1);使用这个我在 Builder.php 第 129 行收到此错误 ModelNotFoundException: No query results for model [App\Subject]。 好吧,这假设您已经正确定义了模型并且您的表中有数据。 ModelNotFoundException 被抛出,因为如果 findOrFail 在您的 subject 表中找不到对应于 id=1 的条目,则应该这样做。如果你的主键不是id,那么你的模型中应该有protected $primaryKey = 'subject_id'; $subjects = Subject::with('subcategory.category')->all();这里不是->all(),我只想要所有表中的几列。你能提供一个例子吗。谢谢,解决方案有效。但我只想查询几列。 这取决于您想要哪些列。您可以像这样指定过滤条件:$subject=Subject::with('subcategoryup.category')->where('name','like','maths')->get(); 或者如果您知道要检索的 ID:$subject=Subject::with('subcategoryup.category')->find([1, 3, 5, 7]);

以上是关于Laravel Eloquent 用于显示主题表中的行?的主要内容,如果未能解决你的问题,请参考以下文章

多个 Laravel Eloquent 关系未显示来自所有关系的数据

使用 laravel eloquent 从两个连接表中获取数据

使用 Laravel 和 Eloquent 从表中全选

Laravel / Eloquent:对包含批准评论的文章的主题进行迭代

Laravel Eloquent 验证插入异常?

Laravel 4 中的 Eloquent 调用:处理多个表中的单个列