如何过滤 belongsToMany 关系? Laravel 5.4
How to filter a belongsToMany relationship? Laravel 5.4
我创建了一个应用程序来过滤数据。在索引内部,我制作了一个过滤器,可以按描述、型号、状态、库存和类别过滤产品。
我的类别是通过 erp_categoy
table 组织的,与产品的关系是通过 erp_product_category
(接收产品 ID + 类别 ID)建立的。
我在模型中创建了 BelongsToMany 关系:Product、Category 和 ProductCategory。
产品型号
public function category()
{
return $this->belongsToMany('App\Category', 'erp_product_category', 'erp_productid', 'erp_categoryid');
}
类别模型
public function product()
{
return $this->belongsToMany('App\Product','erp_product_category', 'erp_categoryid', 'erp_productid');
}
Product_category 型号
public function product()
{
return $this->belongsTo('App\Models\Product', 'erp_categoryid', 'erp_categoryid');
}
在我的索引中,我创建了一个 select 索引,其中列出了 'erp_category' table.
的所有类别
<select id="categoria" name="categoria" class="form-control" style="width: 150px;">
@foreach($cat as $categoria)
<option value="{{$categoria->erp_categoryid}}" @if($categoria->erp_categoryid === session('categoria')) selected @endif >{{$categoria->erp_name}}</option>
@endforeach
</select>
我扩展了 JavaScript 并将值存储在会话 'category' 中。
<script src="{{ asset('assets/js/ProductSearch.js') }}"></script>
<script>
var postSearch = '{{ route('product::searchPost') }}';
var searchRequest = {
'categoria' :'{{session('categoria')}}',
};
</script>
然后我通过JS做了研究
$(document).on('blur', '#categoria', function(){
var categoria = $('#categoria').val();
searchRequest['categoria'] = categoria;
doSearch();
});
function doSearch() {
$.post(postSearch, {
'search_data': JSON.stringify(searchRequest),
'_token': $('meta[name=csrf-token]').attr('content'),
}
, function(data) {
$('#product-table').html(data);
});
}
我期待产品-table(table 我创建了 return 值)。我通过 select 输入的类别列出我的产品,但它 return 是索引的初始列表。
产品-table
<td>
@foreach($prod->category as $categoria)
{{$categoria->erp_name}}
@endforeach
</td>
控制器
public function search(Request $request)
{
$product = Product::query();
$categoria = Category::query();
if ($request->isMethod('post'))
{
$data = json_decode($request->search_data);
$categoria;
$categoria = $data->categoria;
session(['categoria' => $categoria]);
if(strlen(session('categoria')) > 0)
{
$product_ids = Product::whereHas('category', function ($query){
$query->where('erp_category.erp_categoryid', '=', session('categoria'));
})->get();
$ids = [];
foreach($product_ids as $product_data)
{
$ids[] = $product_data->erp_productid;
}
$product = $product->whereIn('erp_category.erp_categoryid', $ids);
}
$content = $product->paginate(10);
$cat = Category::all();
if ($request->isMethod('post'))
{
return view('admin.product-table')->with('product', $content)->with('cat',$cat);
} else
{
return view('admin/product')->with('product', $content)->with('cat',$cat);
}
有什么建议吗?
尝试将您的代码更改为如下内容:
$content = null;
if(strlen(session('categoria')) > 0) {
$product_ids = Product::whereHas('category', function ($query){
$query->where('erp_category.erp_categoryid', '=', session('categoria'));
});
$content = $product_ids->paginate(10);
$cat = Category::all();
}
if ($request->isMethod('post')) {
return view('admin.product-table')->with('product', $content)->with('cat',$cat);
} else {
return view('admin/product')->with('product', $content)->with('cat',$cat);
}
然后是视图:
@if ($product !== null)
@foreach($product as $p)
<td>
@foreach($p->category as $categoria)
{{$categoria->erp_name}}
@endforeach
</td>
@endforeach
@endif
当您调用 whereIn
或类似的东西时,控制器中一定会发生问题。大概不需要再查询Produto了。
第二件事是您没有在视图中使用结果。您正在调用关系函数。
试试看是否有帮助...
我创建了一个应用程序来过滤数据。在索引内部,我制作了一个过滤器,可以按描述、型号、状态、库存和类别过滤产品。
我的类别是通过 erp_categoy
table 组织的,与产品的关系是通过 erp_product_category
(接收产品 ID + 类别 ID)建立的。
我在模型中创建了 BelongsToMany 关系:Product、Category 和 ProductCategory。
产品型号
public function category()
{
return $this->belongsToMany('App\Category', 'erp_product_category', 'erp_productid', 'erp_categoryid');
}
类别模型
public function product()
{
return $this->belongsToMany('App\Product','erp_product_category', 'erp_categoryid', 'erp_productid');
}
Product_category 型号
public function product()
{
return $this->belongsTo('App\Models\Product', 'erp_categoryid', 'erp_categoryid');
}
在我的索引中,我创建了一个 select 索引,其中列出了 'erp_category' table.
的所有类别<select id="categoria" name="categoria" class="form-control" style="width: 150px;">
@foreach($cat as $categoria)
<option value="{{$categoria->erp_categoryid}}" @if($categoria->erp_categoryid === session('categoria')) selected @endif >{{$categoria->erp_name}}</option>
@endforeach
</select>
我扩展了 JavaScript 并将值存储在会话 'category' 中。
<script src="{{ asset('assets/js/ProductSearch.js') }}"></script>
<script>
var postSearch = '{{ route('product::searchPost') }}';
var searchRequest = {
'categoria' :'{{session('categoria')}}',
};
</script>
然后我通过JS做了研究
$(document).on('blur', '#categoria', function(){
var categoria = $('#categoria').val();
searchRequest['categoria'] = categoria;
doSearch();
});
function doSearch() {
$.post(postSearch, {
'search_data': JSON.stringify(searchRequest),
'_token': $('meta[name=csrf-token]').attr('content'),
}
, function(data) {
$('#product-table').html(data);
});
}
我期待产品-table(table 我创建了 return 值)。我通过 select 输入的类别列出我的产品,但它 return 是索引的初始列表。
产品-table
<td>
@foreach($prod->category as $categoria)
{{$categoria->erp_name}}
@endforeach
</td>
控制器
public function search(Request $request)
{
$product = Product::query();
$categoria = Category::query();
if ($request->isMethod('post'))
{
$data = json_decode($request->search_data);
$categoria;
$categoria = $data->categoria;
session(['categoria' => $categoria]);
if(strlen(session('categoria')) > 0)
{
$product_ids = Product::whereHas('category', function ($query){
$query->where('erp_category.erp_categoryid', '=', session('categoria'));
})->get();
$ids = [];
foreach($product_ids as $product_data)
{
$ids[] = $product_data->erp_productid;
}
$product = $product->whereIn('erp_category.erp_categoryid', $ids);
}
$content = $product->paginate(10);
$cat = Category::all();
if ($request->isMethod('post'))
{
return view('admin.product-table')->with('product', $content)->with('cat',$cat);
} else
{
return view('admin/product')->with('product', $content)->with('cat',$cat);
}
有什么建议吗?
尝试将您的代码更改为如下内容:
$content = null;
if(strlen(session('categoria')) > 0) {
$product_ids = Product::whereHas('category', function ($query){
$query->where('erp_category.erp_categoryid', '=', session('categoria'));
});
$content = $product_ids->paginate(10);
$cat = Category::all();
}
if ($request->isMethod('post')) {
return view('admin.product-table')->with('product', $content)->with('cat',$cat);
} else {
return view('admin/product')->with('product', $content)->with('cat',$cat);
}
然后是视图:
@if ($product !== null)
@foreach($product as $p)
<td>
@foreach($p->category as $categoria)
{{$categoria->erp_name}}
@endforeach
</td>
@endforeach
@endif
当您调用 whereIn
或类似的东西时,控制器中一定会发生问题。大概不需要再查询Produto了。
第二件事是您没有在视图中使用结果。您正在调用关系函数。
试试看是否有帮助...