我需要使用从控制器获得的行变量,使用 Ajax 将其发送回另一个控制器

Posted

技术标签:

【中文标题】我需要使用从控制器获得的行变量,使用 Ajax 将其发送回另一个控制器【英文标题】:I need to use my variable of rows that i got from my controller, to send it back to another controller using Ajax 【发布时间】:2021-11-07 16:10:29 【问题描述】:

我有一个视图来显示基于经过身份验证的用户的类别及其产品的菜单,这意味着我只希望显示某些类别/产品,当我输入所有类别的所有产品时,我的问题是在搜索栏中,但是我希望搜索只找到那些特定类别的产品。这就是为什么我尝试使用 ajax 请求发送一个包含对象列表的变量,这些对象是我的类别:

Illuminate\Database\Eloquent\Collection #1381 ▼
  #items: array:1 [▼
   0 => App\Models\Categorie #1385 ▶
  ]

问题是 ajax 给我的 $categories 变量一个错误,我不知道如何在我的脚本中使用这个变量我想发送对象或对象 ID 列表,所以我不能处理它们在我的控制器中使用我的 sql 搜索请求中的 WhereIn 方法,这是我的脚本:

<script>
$(document).ready(function()
    fetch_customer_data();
    function fetch_customer_data(query = '')
    
        var data =[];

        $.each($categories , function( index, value ) 
            data.push(value->id);
        );
        console.log(data);
        $.ajax(
            url:" route('search') ",
            method:'GET',
            data: query: query, data:data ,
            dataType:'json',
            success: function(data) 
                if (data.success) 
                    $('#result').html(data.html);
                 else 
                    console.log(data.message);
                
            
        )
    
    $(document).on('keyup', '#keyword', function($e) // define event parameter
        var query = $(this).val();

        fetch_customer_data(query);
        //$('#result').html(data.html); remove this line
        $e.preventDefault();
    );
);

这是我的控制器方法:

    public function search(Request $request)

    try
        if($request->ajax()) 
            $query = $request->get('query');
            if(empty($query)) 
                return back()->withError("Désolé, une erreur de serveur s'est produite (requête vide)");
             
            else 
                $products =DB::table('product_categories')
                            ->join('produits', 'product_categories.produit', '=', 'produits.id')
                            ->join('categories', 'product_categories.categorie', '=', 'categories.id')
                            ->select('produits.*')
                            ->whereIn('product_categories.categorie',$request->data)
                            ->where([['nomProduit','LIKE','%'.$query.'%'],['categories.visibilite','=',1],['produits.visibilite','=',1]])
                            ->orWhere([['typeActivite','LIKE','%'.$query.'%'],['categories.visibilite','=',1],['produits.visibilite','=',1]])
                            ->get();

            
            $total = $products->count();
            $html = view('front.search_result', [
                    'products' => $products,
                ])->render();


            return response()->json([
                'success' => true,
                'html' => $html,
                'total' => $total,
            ], 200);
         else 
            return response()->json([
                'success' => false,
                'message' => "Oups! quelque chose s'est mal passé !",
            ], 403);
        
    catch (Exception $e) 
        // Something else happened, completely unrelated to Stripe
        Alert::error('Erreur ', $e->getMessage())->autoClose(false);
        return redirect()->back();
    catch (Error $e) 
        // Something else happened, completely unrelated to Stripe
        Alert::error('Erreur ', $e->getMessage())->autoClose(false);
        return redirect()->back();
    

变量 $categories 的类型是:

Illuminate\Database\Eloquent\Collection #1381 ▼
    #items: array:1 [▼
      0 => App\Models\Categorie #1385 ▼
    #fillable: array:4 [▶]
    #files: array:1 [▶]
    #connection: "mysql"
    #table: "categories"
    #primaryKey: "id"
    #keyType: "int"
    +incrementing: true
    #with: []
    #withCount: []
    +preventsLazyLoading: false
    #perPage: 15
    +exists: true
    +wasRecentlyCreated: false
    #attributes: array:9 [▼
        "id" => 4
        "parent_id" => null
        "categorie" => "Informatique"
        "description" => "informatique"
        "photo" => "categories/Informatique .jpg"
        "visibilite" => 1
        "deleted_at" => null
        "created_at" => "2021-04-19 06:33:16"
        "updated_at" => "2021-08-07 14:06:45"
      ]
  #original: array:9 [▶]
  #changes: []
  #casts: []
  #classCastCache: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #guarded: array:1 [▶]

]

最后是错误:

【问题讨论】:

【参考方案1】:

你可能需要! json_encode($categories) !

【讨论】:

当我使用你的答案时,我没有使用任何 javascript,它给了我错误:未捕获的 ReferenceError: json_encode is not defined,这就是我如何使用你的答案 é var data =[];变种猫 = json_encode($categories); $.each(cats, function(index, value) data.push(value.id); );如果你想让我在我的控制器上编码 $categories 我不能因为我主要在我的视图中使用这个变量来显示类别菜单然后我想使用那个 ajax 方法将这些类别传递给另一个控制器。【参考方案2】:

知道了! 这对我来说是这样的:

<script>
$(document).ready(function()
    fetch_customer_data();
    function fetch_customer_data(query = '')
    
        var data =[];
        var cats = @json($categories->toArray());
        console.log(cats);
        $.each(cats , function( index, value ) 
            data.push(cats[index].id);
        );
        console.log(data);

        $.ajax(
            url:" route('search') ",
            method:'GET',
            data: query: query, data : data,
            dataType:'json',
            success: function(data) 
                if (data.success) 
                    $('#result').html(data.html);
                 else 
                    console.log(data.message);
                
            
        )
    
    $(document).on('keyup', '#keyword', function($e) // define event parameter
        var query = $(this).val();

        fetch_customer_data(query);
        //$('#result').html(data.html); remove this line
        $e.preventDefault();
    );
);

并没有改变我的控制器中的任何内容,我使用 compact 发送了 $categories

【讨论】:

以上是关于我需要使用从控制器获得的行变量,使用 Ajax 将其发送回另一个控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AJAX 将数据从视图传递到控制器

如何使用 AJAX 请求将用户在类变量中的 HTML5 位置从 JavaScript 传递到 Rails 控制器?

使用ajax将@Model从视图发送到控制器

Handsontable 最大。使用 AJAX 发布的行

为什么我的ajax请求从Laravel控制器重复相同的数据?

jquery .ajax函数与Laravel-4无法正常工作