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

我有三个数据库表

  1. 类别(ID、名称)
  2. subcategory (id,name,category_id) foreign_key category_id on table category(id)。
  3. 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'); } .

标签: laravel


【解决方案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]);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多