【问题标题】:How to show data from different table in laravel?如何在laravel中显示来自不同表的数据?
【发布时间】:2015-01-18 22:48:31
【问题描述】:

术语表

  • term_id
  • 姓名
  • 蛞蝓

Term_taxonomy 表

  • term_taxonomy_id
  • term_id
  • 说明

我想显示所有记录,如“term_id、name、description

我的术语模型

public function TermTaxonomy(){
    return $this->hasOne('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;
}

使用上面的代码,我想返回每个 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 的新手。

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

    您不能直接访问集合上的关系。我的意思是,你甚至会期待什么?所有的描述都是逗号分隔的列表?

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

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

    ($term-&gt;TermTaxonomy ? $term-&gt;TermTaxonomy-&gt;description : '') 是一个shorthand if。意思是:

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

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


    注意:虽然这可行,但您绝对应该急切地加载TermTaxonomy 关系。你看,如果我们这样离开它,每次你做$term-&gt;TermTaxonomy 时都会运行一个数据库查询。为避免 n+1 查询,请使用 with 预加载关系:

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

    关于您在 cmets 中的问题,是的,您可以限制从 term_taxonomy 中选择的字段:

    $terms = Term::with(['TermTaxonomy' => function($q){
        $q->select('term_id', 'description');
    }])->get(['term_id','name']);
    

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

    【讨论】:

    • 你好 @lukasgeiter 只是尝试这个 $terms = Term::with('TermTaxonomy')-&gt;get(['term_id','name']); foreach($terms as $term){ echo $term-&gt;term_id . " " . $term-&gt;name . " " . $term-&gt;TermTaxonomy-&gt;description; } 并且我得到 尝试获取非对象的属性 但是如果我删除 $ term-&gt;TermTaxonomy-&gt;description ,代码正在工作但只显示term_id 和名称。
    • 也许您有一些术语在数据库中没有分配TermTaxonomy?我更新了我的答案中的代码,如果它检查了...
    • 是的,您是对的,有些术语没有在数据库中分配,但不知道为什么现在它的工作没有删除未分配的术语或术语分类。但是如果我尝试 print() ,它将返回 term_id 、术语表中的名称字段以及术语分类表中的所有字段,我如何才能使用 get() 函数仅从术语分类表中指定几个字段?然后告诉我更多($term-&gt;TermTaxonomy ? $term-&gt;TermTaxonomy-&gt;description : '')的功能,也许你可以给我链接。提前致谢。
    • 感谢您的精彩回答,这正是我想要的。很荣幸成为你的朋友。呵呵:D
    • 很高兴我能帮上忙。祝你有美好的一天!
    【解决方案2】:

    如果您执行$e-all,您将获得一个带有TermTaxanomies 的数组。当您进行特定搜索 (-&gt;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]);
    

    我认为应该可以。

    【讨论】:

    • 感谢您的回答兄弟,但我如何显示每个术语的描述?实际上我想显示 term_id 、 name 、 description 。到目前为止,我可以显示 term_id ,名称但不知道如何显示描述。谢谢
    • $f = $e->all();为您提供所有字段的记录。您可以使用 $tax->field_name 在 foreach 中访问它们
    • $f = $e-&gt;all(); 仅显示术语表中的记录,因为$e 指向术语模型。我需要显示 Term_taxonomy 表中的描述字段。问题是我不能通过 Term Model 的关系调用 TermTaxonomy 方法。 :D
    • 你可以!使用$e-&gt;TermTaxanomy-&gt;description 请注意,名称TermTaxanomy 正是您的关系函数的名称(没有'()')。
    • 只是尝试这段代码$e = new Term; $f = $e-&gt;all(); var_dump($e-&gt;TermTaxonomy-&gt;description);,结果是尝试获取非对象的属性**然后如果我尝试下面的代码$e = new Term; $f = $e-&gt;all(); var_dump($f-&gt;TermTaxonomy-&gt;description);,结果是**未定义的属性:照亮\Database\Eloquent\Collection::$TermTaxonomy
    【解决方案3】:

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

    制作一个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,在body里面试试这样:

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

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

    【讨论】:

    • 那么,如何显示每个术语的描述兄弟?我上面的代码是否有权使用一对一的关系显示描述,或者我如何显示描述?提前致谢。 :D
    • 我想你不清楚你的问题,或者我可能是。但是,我向您展示了一个说明性示例。如果您想显示您的描述,那么只需抛出上面的示例。要获取描述,首先传递一个变量,该变量调用与所需表相关的模型(描述所在的位置)。然后使用 foreach loos 调用描述,如图所示。谢谢。
    • 是的,如果我调用与 term_taxonomy 表相关的模型,我可以获得描述,但在这种情况下,是否可以从 Term 模型中获取描述,因为 term 模型与 TermTaxonomy 模型具有一对一的关系? .无论如何,你给出的答案教我如何以我认为的最佳顺序编写 laravel。
    • 好吧,那是无法从 Term 中获取描述的。现在,如果您认为我的回答对您有所帮助,那么您可以投票并接受答案。谢谢你 。 :)
    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 2021-12-21
    • 2020-06-16
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    相关资源
    最近更新 更多