Как поместить данные в массив массива сессии? - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь сделать корзину и предъявляю следующие требования: 1. когда пользователь нажимает, добавляет в корзину продукт, добавленный в сессию следующим образом:

    Array
    (
        [items] => Array
            (
                [0] => Array
                    (
                        [product_id] => 15
                        [addtocart_totalmrp] => 8953
                        [addtocart_totalsellingprice] => 7876
                        [addtocart_auid] => 7065bec17a101cf2,3025bec186520de3,6725bec18d7889a7
                    )

                [1] => Array
                    (
                        [product_id] => 39
                        [addtocart_totalmrp] => 12654
                        [addtocart_totalsellingprice] => 11876
                        [addtocart_auid] => 1675bed115132bc6,755bed11033fe7d
                    )

            ),
                [2] => Array////which is not coming after 2 it stops and start overwriting the 2nd position 
                    (
                        [product_id] => 39
                        [addtocart_totalmrp] => 12654
                        [addtocart_totalsellingprice] => 11876
                        [addtocart_auid] => 1675bed115132bc6,755bed11033fe7d
                    )

            )

    )

вот мой код:

$cart1 = array("product_id" => $request->product_id,
                "addtocart_totalmrp" => $request->addtocart_totalmrp,
                "addtocart_totalsellingprice" => $request->addtocart_totalsellingprice,
                "addtocart_auid" => $request->addtocart_auid);


            if ($request->session()->has('cart')) {

                $products = Session::get('cart.items', array());  // get existed products or empty array

                $products["items"][] = $cart1;                      // add new product to list
                echo'<pre>';
                print_r($products);


                Session::push('cart.items', $products);      //putting that data to cart 

                print_r(count($products));
                dd($products);

            } else {
                echo 'session haas no data';
                $products["items"][] = $cart1;                      // add new product to list
                print_r($products);
                Session::put('cart.items', $products); 

            }

моя проблема: , когда я пытаюсь добавить третий продукт, он перезаписывает второй, не знаю, как это сделать.

IЯ пробовал этот код и он работает, но есть ключ элемента, который я использовал однажды, когда снова приходил, для этого есть структура массива:

array:1 [
  "items" => array:4 [
    "items" => array:1 [
      0 => array:4 [
        "product_id" => "39"
        "addtocart_totalmrp" => "12654"
        "addtocart_totalsellingprice" => "11876"
        "addtocart_auid" => "1675bed115132bc6,755bed11033fe7d"
      ]
    ]
    0 => array:4 [
      "product_id" => "28"
      "addtocart_totalmrp" => "17145"
      "addtocart_totalsellingprice" => "12165"
      "addtocart_auid" => "5205bed102b6d856,8255bed103e3ce14"
    ]
    1 => array:4 [
      "product_id" => "15"
      "addtocart_totalmrp" => "8953"
      "addtocart_totalsellingprice" => "7876"
      "addtocart_auid" => "7065bec17a101cf2,3025bec186520de3,6725bec18d7889a7"
    ]
    2 => array:4 [
      "product_id" => "15"
      "addtocart_totalmrp" => "8953"
      "addtocart_totalsellingprice" => "7876"
      "addtocart_auid" => "7065bec17a101cf2,3025bec186520de3,6725bec18d7889a7"
    ]
  ]
]

мой новый код

if ($request->session()->has('cart')) {

//                 $productsfromsession = Session::get('cart', array());  // get existed products or empty array
// dd($productsfromsession);
//                 $products["items"][] = $cart1;                      // add new product to list
//                 echo'<pre>';
//                 print_r($products);



                Session::push('cart.items',$cart1);      //putting that data to cart 
                $a=Session::get('cart', array());
                //print_r(count($products));
                dd($a);

            } else {
                echo 'session haas no data <pre>';
                $products["items"][] = $cart1;                      // add new product to list
                print_r($products);
                Session::put('cart.items', $products); 

            }

Новое обновление кода в соответствии с ответом:

$cart1 = array("product_id" => $request->product_id,
                "addtocart_totalmrp" => $request->addtocart_totalmrp,
                "addtocart_totalsellingprice" => $request->addtocart_totalsellingprice,
                "addtocart_auid" => $request->addtocart_auid);



if ($request->session()->has('cart')) {




                Session::push('cart.items',$cart1);      //putting that data to cart 
                $a=Session::get('cart', array());
                //print_r(count($products));
                dd($a);

            } else {
                echo 'session haas no data <pre>';
                $products = [ $cart1 ];  // create a new cart and add a product in it
                Session::put('cart.items', $products); 
                print_r($products);
            }

код работает отлично, но проблема замены снова начала что-то не хватает в моем коде?

вот что я хочу, чтобы мой кодэто спер спросил в ответах:

public function addtocart(Request $request) {


// if user logged in check login and add data directly to cart without session 
        if (Auth::check()) {
            $user = Auth::user();
            echo 'auth sucess';
            //   adding data to table directly       //
        } else {

// adding data to cart with session 

            $cart1 = array("product_id" => $request->product_id,
                "addtocart_totalmrp" => $request->addtocart_totalmrp,
                "addtocart_totalsellingprice" => $request->addtocart_totalsellingprice,
                "addtocart_auid" => $request->addtocart_auid);
            print_r('am current cart data : <pre>');
            print_r($cart1);

// checking for session has cart or not 

            if (Session::has('cartdata')) {

                echo ' session cart has data ';
            } else {

                echo 'session has no data add first data to session ';
            }
        }
    }

}

Я попробовал новую концепцию структуры JSON, может ли вы помочь мне, где я ошибаюсь, когда я пытаюсь поместить данные в массив, который он идет, и прекратить толкать массив после2-я позиция вот мой код:

// adding data to cart with session
            $cartdata = array("product_id" => $request->product_id,
                "addtocart_totalmrp" => $request->addtocart_totalmrp,
                "addtocart_totalsellingprice" => $request->addtocart_totalsellingprice,
                "addtocart_auid" => $request->addtocart_auid);
            // print_r('am current cart data : <pre>');
             //print_r($cartdata);


// checking for session has cart or not

            if (Session::has('cartdata')) {

              // dd(Session::get('cartdata'));

                 echo ' session cart has new data and it is :<pre> ';

                 //// fethcing old data from session
                $productsfromsession = Session::get('cartdata');  // get existed array value


            //   decoding old data to normal array 
                $data=json_decode($productsfromsession);


                //dd($data); 


                // pushing new data to old product array 

                 array_push($data->products,$cartdata);


                // saving new data and encoding it again 
                $newdata=json_encode($data);

                dd($newdata);               ///every time i add data to this array its stop after 2nd inserted 
                // removing old data from session 
                  $request->session()->forget('cartdata');


                // putting new data to session   
                 Session::put('cartdata',$newdata); 

                //  printing result 
                dd(Session::get('cartdata'));

            //// printng current cart data after pusing new data


             } else {


                  echo 'session has no data adding  first data to session is <pre>';

                  //     // putting first item to array
                  $products[]=$cartdata;
                 $cartdata=array("total_price"=>10,"products"=>$products);
            $cartdata=json_encode($cartdata);
              Session::put('cartdata', $cartdata);

                 $data = Session::all();
               print_r($data);
            }

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

В вашем новом коде я нахожу это странным делом, когда в сеансе нет "корзины".

$products["items"][] = $cart1;  // add new product to 
print_r($products);
Session::put('cart.items', $products);

Этот код выше создаст массивпродукты, вложенные в «элементы», которые сами по себе являются вложенными.

[
   "cart" => [
      "items" => [
          "items" => [ $cart1 ]
      ]
   ]
]

Session::push довольно устойчивы.Он уже предварительно проверяет значение для данного ключа в сеансе перед добавлением к нему данного значения.Если значение не является массивом, оно инициализирует пустое и добавляет указанное значение.

Ветвь if-else становится избыточной при использовании Session::push.

$cart = [/*...*/];
Session::push('cart.items', $cart);
0 голосов
/ 22 ноября 2018

Попробуйте:

Session::push('cart.items', $cart1);

для получения дополнительной информации о сеансе посмотрите на это:

https://laravel.com/docs/5.7/session#storing-data

...