【问题标题】:How to filter a belongsToMany relationship? Laravel 5.4如何过滤 belongsToMany 关系?拉拉维尔 5.4
【发布时间】:2017-10-02 16:42:28
【问题描述】:

我创建了一个过滤数据的应用程序。在索引内部,我做了一个过滤器,按描述、型号、状态、库存和类别过滤产品。 我的类别通过erp_categoy 表组织,与产品的关系通过erp_product_category(接收产品ID + 类别ID)建立。 我在 Model 中创建了 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');
    }

产品类别模型

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

有什么建议吗?

【问题讨论】:

  • 发帖后你在哪里用search_data搜索?
  • @Laerte 我忘了放控制器。我已经修好了。对不起。
  • 如果你dd($content); 结果是你所期望的?
  • @Laerte My dd 从起始表返回数据,未按类别进行组织。
  • 如果你在dd($product_ids);之前$ids = [];结果是什么? whereHas 查询似乎是正确的,但它可能没有进入 if 子句并为空查询分页。

标签: javascript php laravel laravel-5 has-and-belongs-to-many


【解决方案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。

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

试试这个,看看它是否有帮助......

【讨论】:

  • 它仍然给出同样的错误,我已经创建了类似的问题,但我仍然无法解决它。据我所知,你也是巴西人。我不想占便宜,但是你有Skype什么的吗?我对这个错误有点绝望。
  • 我们聊天聊聊
猜你喜欢
  • 1970-01-01
  • 2020-09-26
  • 2018-06-08
  • 1970-01-01
  • 2021-08-15
  • 2018-10-14
  • 2017-10-06
  • 2021-10-29
  • 2015-04-13
相关资源
最近更新 更多