如何在 laravel 中显示来自不同 table 的数据?
How to show data from different table in laravel?
条款table
- term_id
- 名字
- 鼻涕虫
Term_taxonomy table
- term_taxonomy_id
- term_id
- 描述
我想显示所有记录,如“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
)
条款table
- term_id
- 名字
- 鼻涕虫
Term_taxonomy table
- term_taxonomy_id
- term_id
- 描述
我想显示所有记录,如“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
:
$terms = Term::with(['TermTaxonomy' => function($q){
$q->select('term_id', 'description');
}])->get(['term_id','name']);
只需确保包含建立关系所需的列(在本例中 term_id
)