如何在 laravel 中显示来自不同 table 的数据?

How to show data from different table in laravel?

条款table

Term_taxonomy table

我想显示所有记录,如“term_id、名称、描述

我的学期模型

public function TermTaxonomy(){
    return $this->hasOne('TermTaxonomy');
}

我的 TermTaxonomy 模型

public function Term(){
    return $this->belongsTo('Term');
}

我的路线

$term = new Term;
$categories = $term->all(['term_id', 'name']);
foreach($categories as $category){
    echo $category->term_id . " " . $category->name . " " . "description of term_id should here" ;} 

尝试此代码但未定义错误 属性:Illuminate\Database\Eloquent\Collection::$TermTaxonomy

$e = new Term;
$f = $e->all(['term_id','name']);
    echo $f->TermTaxonomy->description;
}

使用上面的代码我想 return 每个 term_id 的所有描述,但我很困惑为什么我可以显示描述如果对象只是 1,如下面的代码

$a = new Term;
$b = $a->all(['term_id','name'])->find(8);
echo $b->TermTaxonomy->description . "<br>"; // work return description of $b;

那么一对一关系函数到底是什么?只有当对象只有 1 时,一对一才有效吗?

我的情况呢?使用关系方法显示所有描述是我的逻辑错误吗?那么我必须怎么做才能显示术语 ID、名称、描述列表?

在此先感谢,我在 laravel 中完全是新手。

如果您执行 $e-all,您将得到一个包含 TermTaxanomies 的数组。当您进行特定搜索 (->find(8)) 时,您只会得到 id = 8 的对象。

您需要做的就是使用 foreach 或使用索引号:

$f = $e->all(['term_id','name']);
foreach($f as $tax){
    var_dump($tax);
}

$f = $e->all(['term_id','name']);
var_dump($f[1]);
var_dump($f[4]);

我认为应该可行。

糟糕!看起来您正在尝试将原始 php 代码实现到 Laravel 中。请摆脱它,按照下面的说明进行操作。

制作 Route:

    Route::get('/term' , array('uses' => 'TermsController@showTerm'));

现在创建一个名为 TermsController.php 的控制器并尝试如下操作:

       <?php
          class TermsController extends BaseController {
               public function showTerm(){
                       $terms = Term::all();
              return View::make('show_term.blade.php')->with('terms' , $terms);
           }
       }//class ends

现在创建一个名为 Term.php 的模型:

 <?php
       class Terms extends \Eloquent{
         protected $fillable = array();
         protected $table = 'terms'; //terms is your database table name
   }?>

现在做一个show_term.blade.php :

   @extends(layouts.master)
   @section('content)
    foreach($terms as term){
     {{$term->id}} , {{$term->name}} , {{$term->slug}}}
      @stop

如果您没有 layouts.master,则在您的 View 文件夹中创建一个 layouts 文件夹。然后创建一个 master.blade.php 编写基本的 html 并在主体内部尝试这样:

  <div class="container"> 
    @yield('content')
   </div>

谢谢。如果您还需要什么,请告诉我。

您无法直接访问集合上的关系。我的意思是,你甚至期望什么?所有描述都以逗号分隔列表吗?

相反,您只是在遍历所有关系时访问关系。 (这可能在视图中,所以我将在此示例中使用 Blade 语法)

@foreach($terms as $term)
    {{ $term->term_id }} {{ $term->name }} {{ ($term->TermTaxonomy ? $term->TermTaxonomy->description : '') }}
@endforeach

($term->TermTaxonomy ? $term->TermTaxonomy->description : '') 是一个 shorthand if。这意味着:

if($term->TermTaxonomy){
    echo $term->TermTaxonomy->description;
}
else {
    echo '';
}

之所以有效,是因为如果 Term 没有分配 TermTaxonomy,则 $term->TermTaxonomy 将为空。使用此代码,我们仅在 TermTaxonomy 存在时才尝试访问 ->description,因此可以避免 Trying to get property of non-object 异常。


注意: 虽然这有效,但您绝对应该 eager load TermTaxonomy 关系。你看如果我们就这样保留它,每次你做 $term->TermTaxonomy 数据库查询将是 运行。为了避免 n+1 查询,使用 with 来预加载关系:

$terms = Term::with('TermTaxonomy')->get(['term_id','name']);

关于您在评论中提出的问题,是的,您可以从 term_taxonomy:

中限制您 select 的字段
$terms = Term::with(['TermTaxonomy' => function($q){
    $q->select('term_id', 'description');
}])->get(['term_id','name']);

只需确保包含建立关系所需的列(在本例中 term_id