我正在使用Laravel 5.2开发电子商务系统,该系统具有类别的自定义字段。
关系和表格如下。
产品表
列 - ProductID,ProductName
我有两种产品(HP和Lenovo Laptops),其数据显示在 CustomFieldValues 表中。
品牌,内存,处理器,存储大小等自定义字段存储在 CustomFields 表中。
自定义字段和类别之间的关系是我们为每个类别设置了不同的自定义字段。
例如,汽车可能有颜色和传输自定义字段。 我只为这个问题选择了笔记本电脑类别。这就是CategoryID = 1
的原因每个产品的自定义值都存储在 CustomFieldValues 表
中这是控制器
public function subcategories($CategoryID)
{
$subcategories = DB::table('customfields')
->leftJoin('customfieldvalues', 'customfields.CustomFieldID', '=', 'customfieldvalues.CustomFieldID')
->select('customfieldvalues.*', 'customfields.CustomFieldName')
->groupBy('ProductID', 'customfields.CustomFieldID')
->where('customfields.CategoryID', '=', $CategoryID)
->get();
return view('categories.subcategories')
->with('subcategories', $subcategories);
}
这是我的观点
@extends('layouts.default')
@section('content')
<div class="row">
@foreach($subcategories as $subcategory)
<p>
{{$subcategory->CustomFieldName}} - {{$subcategory->CustomFieldValue}}
<p>
@endforeach
</div>
@endsection
结果是
笔记本电脑品牌 - 惠普
处理器 - 酷睿i3
RAM - 4GB
存储容量 - 500GB
笔记本电脑品牌 - 联想
处理器 - 酷睿i3
RAM - 8GB
存储容量 - 1 TB
现在,我想知道的是如何组织和显示像
这样的数据 HP
联想
4GB
8GB
Core i5
1TB
500GB
我可以使用现有的结果集获得所需的结果,但是通过循环遍历数组并重新排列,或者我是否必须处理Controller的查询。
答案 0 :(得分:1)
您可以尝试这样来获得结果:
<!-- Content -->
<form method="post" action="">
<div id="main">
<div class="wrapper cf">
<div class="content contact-block cf">
<h2><i>Contact</i> Us</h2>
<div class="sidebar-form cf">
<div class="row"><input id="firstname" type="text" name="fname" value="" placeholder="FIRST NAME" /></div>
<div class="row"><input id="lastname" type="text" name="lname" value="" placeholder="LAST NAME" /></div>
<div class="row"><input id="email" type="text" name="email" value="" placeholder="EMAIL ADDRESS" /></div>
<div class="row"><input id="order" type="text" name="order" value="" placeholder="ORDER NUMBER" /></div>
<div class="row">
<select id="subject" name="subject">
<option value="0" selected="selected">SUBJECT</option>
<option value="1">Received Error Message</option>
<option value="2">Login Issues</option>
<option value="3">Billing Questions</option>
<option value="4">Membership Questions</option>
<option value="5">Privacy Issues</option>
<option value="6">Report Abuse</option>
<option value="7">Legal Department</option>
<option value="8">Other</option>
<option value="9">How Do I Access Reports I've Run</option>
<option value="10">Account Cancellation</option>
</select>
</div>
<div class="row"><textarea name="comments" cols="" rows="" placeholder="COMMENTS OR QUESTIONS"></textarea></div>
<div class="row"><input type="submit" name="submit" value="Submit" /></div>
</div>
</div>
</div>
</div>
<!-- // Content -->
</form>
结果输出为:
$data = DB::table('tbl_name')
->select('CustomFieldName', DB::raw('GROUP_CONCAT(CustomFieldValue) as fieldValue'))
->groupBy('CustomFieldName')
->get();
所以,现在你必须探索&#34; fieldValue&#34;列将输出显示到视图中。
答案 1 :(得分:0)
您必须将groupBy
与orderBy
一起使用。在文档中:https://laravel.com/docs/5.5/queries#ordering-grouping-limit-and-offset
$results = DB::table('table_name')
->orderBy('CustomFieldName', 'asc')
->groupBy('CustomFieldName')
->get();
在Eloquent中,
$results = App\ModelName::orderBy('CustomFieldName', 'asc')
->groupBy('CustomFieldName')
->get();
在我的案例中,groupBy
很适合我,以显示类似的类型数据。你可以试试这个..
答案 2 :(得分:0)
你可以试试这个。
这是主表(CustomFields)
这是Child表(CustomFieldValues)
现在你必须指定两个表的外键关系,
CustomFields.CustomFieldID = CustomFieldValues.CustomFieldID
Laravel提供了雄辩的关系,https://laravel.com/docs/5.2/eloquent-relationships#one-to-many
在App \ CustomFields Model
中编写此函数public function fieldValue()
{
return $this->hasMany('App\CustomFieldValues');
}
将此代码写入Controller Function,
public function subcategories($CategoryID)
{
$subcategories = App\CustomFields::with('fieldValue')->get();
return view('categories.subcategories')->with('subcategories', $subcategories);
}
https://laravel.com/docs/5.2/eloquent-relationships#constraining-eager-loads
渲染视图,
@extends('layouts.default')
@section('content')
<div class="row">
@foreach($subcategories->fieldValue as $subcategory)
<p>
{{$subcategory->CustomFieldName}} - {{$subcategory->CustomFieldValue}}
<p>
@endforeach
</div>
@endsection
现在您可以达到您的要求。