首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在雄辩中获得多重关系

在雄辩中获得多重关系
EN

Stack Overflow用户
提问于 2016-03-13 22:33:13
回答 3查看 52关注 0票数 0

“雄辩”中模特儿的基本误区(Laravel之外)

我之前的问题ceejayoz帮助我指出了正确的方向,但这让我想到了基本上是一个新的问题。

我正在开发一个简单的化学追踪数据库,它的结构是一个化学品表,它可以跟踪大部分信息,但我有几个字段一开始是Enum,但我意识到这是行不通的。现在有单独的桌子为公司,房间和地点。所有这些附加表都只包含一个id和字段,因此公司是:

1名“FISHER”

2.“BDH”

等。

我能做到

代码语言:javascript
复制
$company = chemical::find(4)->company;

例如,这将给出该化学品的公司名称,但我要做的是显示一张表格,其中包含每种化学品的所有信息,以及相关公司的名称、房间和位置。我只是不知道如何做到这一点。

我怎么才能得到所有化学品的关联公司?

代码语言:javascript
复制
$chemicals = company::all()->company;

不起作用我明白原因了。

代码语言:javascript
复制
$chemicals = chemical::all();   

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

会给我带来关联公司,这很好,但从综合表的角度来看,我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-14 01:33:53

您没有指定表companyroomlocation如何与chemicals相关。但是,如果它们都是belongsTo类型的关系,那么我相信您正在寻找急装

在查询父模型时,雄辩者可以“急切地加载”关系。急切的加载减轻了N+1查询问题

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

代码语言:javascript
复制
$chemicals = chemical::with('company', 'room', 'location')->get();

如果您正在使用像Twig或Blade这样的模板引擎(希望是这样),那么您可以将您的$chemicals直接传递给模板。否则,您可以像您在问题中演示的那样,遍历$chemicals

代码语言:javascript
复制
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>";

还请注意,雄辩的惯例是将模型类名(Chemicals,而不是chemicals)大写。

票数 1
EN

Stack Overflow用户

发布于 2016-03-13 23:56:22

这个问题有点不清楚,但是对于一个包含他们公司数据的化学品表来说,你可以做一些类似的事情。在您的控制器中:

代码语言:javascript
复制
// 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);

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

代码语言:javascript
复制
<table>
  @foreach($chemicals as $chemical)
    <tr>
      <td>{{ $chemical->name }}</td>
      <td>{{ $chemical->company->name }}</td>
    </tr>
  @endforeach
</table>
票数 1
EN

Stack Overflow用户

发布于 2016-03-14 11:23:14

我想,你想要的是:

代码语言:javascript
复制
chemicals: id, company (ENUM), ...

现在,您将数据提取到

代码语言:javascript
复制
companies: id, name (same as ENUM in chemicals previously)

如果是这样的话,你可以做两件事:

  1. 创建与idcompany_id的普通关系键更新您的chemicals表,根据它们的company enum/string值添加适当的company_id值,然后删除company列。它可能需要更多的调整。在任何地方,您调用chemical->company以获取公司名称(变成chemical->company->name)
  2. 基于chemicals.companycompanies.name字段创建关系。

从长远来看,第一个选择肯定会更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35976712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档