从Laravel搜索结果

时间:2017-10-05 08:14:00

标签: php laravel laravel-5.2 laravel-blade

我正在使用Laravel 5.2开发电子商务系统,该系统具有类别的自定义字段。

关系和表格如下。

产品表
列 - ProductID,ProductName

我有两种产品(HP和Lenovo Laptops),其数据显示在 CustomFieldValues 表中。

品牌,内存,处理器,存储大小等自定义字段存储在 CustomFields 表中。

自定义字段和类别之间的关系是我们为每个类别设置了不同的自定义字段。

例如,汽车可能有颜色和传输自定义字段。 我只为这个问题选择了笔记本电脑类别。这就是CategoryID = 1

的原因

enter image description here

每个产品的自定义值都存储在 CustomFieldValues

enter image description here

这是控制器

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
联想

RAM

4GB
8GB

处理器

Core i5

存储大小

1TB
500GB

我可以使用现有的结果集获得所需的结果,但是通过循环遍历数组并重新排列,或者我是否必须处理Controller的查询。

3 个答案:

答案 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)

您必须将groupByorderBy一起使用。在文档中: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)

This is the master table (Custom Fields)

这是Child表(CustomFieldValues)

This is the Child table (Custom Fields Value)

现在你必须指定两个表的外键关系,

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

现在您可以达到您的要求。