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

Posted

技术标签:

【中文标题】使用 laravel eloquent 从两个连接表中获取数据【英文标题】:Fetch data from two joined tables using laravel eloquent 【发布时间】:2013-05-17 01:44:27 【问题描述】:

我有两个表,模块 (id,module_name) 和 sub_modules(id,module_id,sub_module_name)。 我想显示一个像这样结构的表格:

Sub Module ID | Module Name | Sub Module Name

Modules.php(模型)

class Modules extends Eloquent 

 protected $table = 'modules';

 public function submodules()
 
    return $this->hasMany('SubModules','module_id');
 

SubModules.php(模型)

class SubModules extends Eloquent 

  protected $table = 'sub_modules';

  public function modules() 
    return $this->belongsTo('Modules');
  

  public function nodes()
  
    return $this->hasMany('Nodes','sub_module_id');
  

AdminController.php(控制器)

  public function subModules() 
     return View::make('sub-modules',
                        array('title'=>'Sub-Modules',
                       'modules'=>Modules::all(),
                       'sub'=>Modules::with(array('submodules'))->get()                 
                      )
     );
  

在我的子模块视图中,我正在获取 $sub 变量,如下所示:

@foreach ($sub as $sub)
   <tr class="gradeX">
      <td>
         <input type="checkbox" value=" $sub->id " id="check_ $sub->id "/>
      </td>
      <td>
          $sub->module_name  
      </td>
      <td>
          $sub->sub_module_name  
      </td>
      <td>
          <a onclick="edit_sub_module( $sub->id )" title="Edit"><i class="icon-edit icon-2x"></i></a>
      </td>
    </tr>
@endforeach

它不显示 sub_modules table($sub->sub_module_name) 中的内容,仅显示模块中的内容。如何解决这个问题?而且两个表中都有 id 字段,我只需要 sub_modules 中的 id。

【问题讨论】:

解决了这个问题:SubModules::join('modules', 'modules.id', '=','sub_modules.module_id')->select('sub_modules.*','modules .module_name')->get() 。但是有谁知道如何用雄辩的关系做到这一点? 如果您可以将您的评论作为答案,这样人们在找到您的问题时会看到它会更好。 @Anshad 正如菲尔所说,将其作为答案。 Eloquents 关系不会按照您需要的方式为您构建结果集。 【参考方案1】:

解决了这个问题:

SubModules::join('modules', 'modules.id', '=','sub_modules.module_id')
->select('sub_modules.*','modules.module_name')->get‌​()

但是有谁知道如何用雄辩的关系做到这一点?

【讨论】:

,你如何用雄辩的关系做到这一点?【参考方案2】:

这个怎么样:

public function subModules() 
     return View::make('sub-modules',
                        array('title'=>'Sub-Modules',
                       'modules'=>Modules::all(),
                       'sub'=>Modules::with('submodules')->get()                 
                      )
     );
  

【讨论】:

【参考方案3】:

你可以调用你的 AdminController.php

$module = new \App\Module::find(1); // put needed module_id;
$submodules = $module->submodules()
    ->join('modules', 'modules.id', '=','sub_modules.module_id')
    ->select('sub_modules.*','modules.module_name')
    ->get‌​();

$module-&gt;submodules() 返回Illuminate\Database\Eloquent\Relations\HasMany 类,可以调用join()select() 等。

【讨论】:

【参考方案4】:

不使用“get()”无法获取子模块数据

$submoduledata = Module::find($id)->subModule()->get();

【讨论】:

以上是关于使用 laravel eloquent 从两个连接表中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel Eloquent 连接同一服务器上不同数据库中的两个 MySQL 表

用 Laravel/Eloquent 为 Yajra DataTables 编写连接查询的慢 MySQL

限制从 Laravel Eloquent 中连接的表/模型返回的字段

Laravel Eloquent:如何从连接表中仅获取某些列

Laravel Eloquent 在与其他表连接后从关系中选择字段

Laravel Eloquent 从关系中选择