在Eloquent中获得多种关系

时间:2016-03-13 22:33:14

标签: eloquent relationships

Fundamental misunderstanding of model in Eloquent (Outside of Laravel)

我之前提出的一个问题,即ceejayoz帮助我指出了正确的方向,但这导致了我基本上是一个新问题。

我正在研究一个简单的化学跟踪数据库,并使用化学品表来跟踪大部分信息,但我有一些字段最初是作为Enums但我意识到这不适用。现在有公司,房间和位置的单独表格。所有这些附加表只包括一个id和字段,因此公司是:

1 | ' FISHER'

2 | ' BDH'

我能做到

$company = chemical::find(4)->company;
例如,这将为我提供该化学品公司的名称,但我要做的是显示一个表格,其中包含每种化学品的所有信息,以及相关的公司名称,房间,位置。 我只是不确定如何做到这一点。

我如何获得所有化学品的关联公司?

$chemicals = company::all()->company;

不起作用,我明白为什么。

$chemicals = chemical::all();   

foreach($chemicals as $chem) {
    echo $chem->company . "<br />";
}  

会让我联系到相关公司,这很棒,但那么我在哪里可以从全面的表格中找到它?

3 个答案:

答案 0 :(得分:1)

这个问题有点不清楚,但对于包含公司数据的化学品表,你可以按照这些方针做点什么。在您的控制器中:

// we use with() to "eager load" the company data
// this makes the following line execute two queries
// without the with(), our Blade template will make a query
// to the companies table for EVERY row in the table

// if you have hundreds/thousands of chemicals, you'll
// want to consider paginate() instead of get() too

$chemicals = Chemical::with('company')->get();

return view('your.view')->withChemicals($chemicals);

在您的Blade视图中,您可以访问每个化学品公司的所有属性:

<table>
  @foreach($chemicals as $chemical)
    <tr>
      <td>{{ $chemical->name }}</td>
      <td>{{ $chemical->company->name }}</td>
    </tr>
  @endforeach
</table>

答案 1 :(得分:1)

您没有指定表格companyroomlocationchemicals的关联方式。但是,如果它们都是belongsTo类型关系,那么我相信您正在寻找Eager Loading

  

Eloquent可以在您查询父模型时“急切加载”关系。急切加载缓解了N + 1 query problem

要急切加载多个关系,您可以执行以下操作:

$chemicals = chemical::with('company', 'room', 'location')->get();

如果您正在使用像Twig或Blade这样的模板引擎(希望您是这样),则可以将$chemicals直接传递给模板。否则,您可以按照问题中的说明迭代$chemicals

echo "<table><thead><tr>
      <th>Chemical ID</th>
      <th>Chemical Name</th>
      <th>Company Name</th>
      <th>Location Name</th>
      <th>Room Name</th>
      </tr></thead><tbody>";

foreach($chemicals as $chem) {
    echo "<tr><td>{$chem->id}</td>
              <td>{$chem->name}</td>
              <td>{$chem->company->name}</td>
              <td>{$chem->location->name}</td>
              <td>{$chem->room->name}</td>
          </tr>";
}
echo "</tbody></table>";

另请注意,Eloquent中的约定是将您的模型类名称(Chemicals,而不是chemicals)大写。

答案 2 :(得分:0)

我想,你问的是这个:

chemicals: id, company (ENUM), ...

现在您将数据提取到

companies: id, name (same as ENUM in chemicals previously)

如果是这种情况,那么你可以做两件事:

  1. idcompany_id创建普通关系更新您的chemicals表,以添加相应的company_id值在company枚举/字符串值上,然后删除company列。可能需要更多调整,例如。您调用chemical->company以获取公司名称的所有地方(成为chemical->company->name

  2. 根据chemicals.companycompanies.name字段创建关系。

  3. 从长远来看,绝对是第一个选择。