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 />";
}
会让我联系到相关公司,这很棒,但那么我在哪里可以从全面的表格中找到它?
答案 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)
您没有指定表格company
,room
和location
与chemicals
的关联方式。但是,如果它们都是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)
如果是这种情况,那么你可以做两件事:
与id
和company_id
创建普通关系和更新您的chemicals
表,以添加相应的company_id
值在company
枚举/字符串值上,然后删除company
列。可能需要更多调整,例如。您调用chemical->company
以获取公司名称的所有地方(成为chemical->company->name
)
根据chemicals.company
和companies.name
字段创建关系。
从长远来看,绝对是第一个选择。