【问题标题】:Getting multiple relationships in Eloquent在 Eloquent 中获取多个关系
【发布时间】:2016-03-13 22:33:13
【问题描述】:

Fundamental misunderstanding of model in Eloquent (Outside of Laravel)

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

我正在开发一个简单的化学品跟踪数据库,并使用一个化学品表来构建它,该表可以跟踪大部分信息,但我有一些字段以枚举开头,但我意识到这不起作用。现在有用于公司、房间和位置的单独表格。所有这些附加表都只包含一个 id 和字段,因此 company 是:

1 | '渔夫'

2 | 'BDH'

等等

我可以的

$company = chemical::find(4)->company;

例如,这将为我提供该化学品的公司名称,但我要做的是显示一个表格,其中包含每种化学品的所有信息,以及相关的公司名称、房间、位置. 我只是不确定如何做到这一点。

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

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

不起作用,我知道原因。

$chemicals = chemical::all();   

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

会给我找到关联公司,这很好,但是就综合表而言,我该从哪里开始呢?

【问题讨论】:

    标签: eloquent relationships


    【解决方案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)。

    【讨论】:

    • 是的。这正是我需要的,非常感谢。我实际上阅读了那个急切的加载页面,但它并没有真正点击那是我所需要的。我正在使用 Twig,所以只需调用我的循环 chem.company.company。是的,你当然是正确的大小写。我会解决的。再次感谢。
    【解决方案2】:

    这个问题有点不清楚,但是对于包含其公司数据的化学品表,您可以按照这些思路进行操作。在您的控制器中:

    // 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 用于分页提示,因为是的,有数千种化学物质。
    • @danny2327 很高兴我能帮上忙。 :-)
    【解决方案3】:

    我猜,你问的是这个:

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

    现在您将数据提取到

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

    如果是这样,那么你可以做两件事:

    1. 创建与idcompany_id 的普通关系作为键更新您的chemicals 表以添加适当的company_id 值,具体取决于它们的company 枚举/字符串值,然后删除 company 列。它可能需要更多的调整,例如。在任何地方你打电话给chemical-&gt;company 以获取公司名称(变成chemical-&gt;company-&gt;name

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      相关资源
      最近更新 更多