2017-05-04 60 views
2

我创建了一个应用程序来过滤数据。在索引内部,我制作了一个过滤器,按照说明,模型,状态,库存和类别过滤产品。 我的类别是通过erp_categoy表组织的,并且通过​​(接收产品ID +类别ID)与产品的关系进行组织。 我在Model:Product,Category和ProductCategory中创建了一个BelongsToMany关系。如何过滤belongsToMany关系? Laravel 5.4

产品型号

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'); 
    } 

在我的索引我创建了一个列出'erp_category'表的所有类别的选择。

<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并将值存储在会话“类别”中。

<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); 
     }); 
} 

我期待产品表(我创建的表来返回值)。我通过select所输入的类别列出了我的产品,但它会返回索引的初始列表。

产品表

<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); 
     } 

什么建议吗?

+0

你在哪里使用'search_data'搜索后通话? – Laerte

+0

@Laerte我忘了把我的控制器。我已经修好了。抱歉。 –

+0

如果你是'dd($ content);'结果是你所期望的? – Laerte

回答

1

试图改变你的代码是这样的:

$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。

第二件事是你没有在视图中使用结果。你在调用关系函数。

试试这个,并检查它是否有帮助...

+0

它仍然给出了同样的错误,我已经创建了类似的问题,但我仍然无法解决它,从我所看到的你也是巴西人,我不想利用,但会你有Skype或什么?我有点绝望,因为这个错误 –

+0

让我们聊聊吧 – Laerte