Laravel 5.1 – Datos de forma de almacenamiento de error,

Tengo un problema en los datos de almacenamiento del formulario de solicitud Después del pago de PayPal. Este es mi error

SQLSTATE [23000]: violación de la restricción de integridad: 1048 La columna ‘fullname_ship’ no puede ser nula (SQL: insertar en las orders ( subtotal , shipping , fullname_ship , updated_at , created_at ) values ​​(10, 1 created_at 2016-05-09 15:39: 40, 2016-05-09 15:39:40)

MODELO DE PEDIDO.PHP

 <?php namespace dixard; use Illuminate\Database\Eloquent\Model; class Order extends Model { protected $table = 'orders'; protected $fillable = [ 'subtotal', 'shipping', 'fullname_ship', ]; } 

PÁGINA DE PAGO-PEDIDO-DETALLE.PHP

 

PAYPALCONTROLLER.PHP

 _api_context = new ApiContext(new OAuthTokenCredential($paypal_conf['client_id'], $paypal_conf['secret'])); $this->_api_context->setConfig($paypal_conf['settings']); } // postPayment public function postPayment(Request $request) { $payer = new Payer(); $payer->setPaymentMethod('paypal'); $items = array(); $subtotal = 0; $cart = \Session::get('cart'); //ottenere tutta l'informazione dalla session cart $currency = 'EUR'; // impostiamo tutte le informazioni foreach($cart as $producto){ $item = new Item(); $item->setName($producto->name) ->setCurrency($currency) ->setDescription($producto->extract) ->setQuantity($producto->quantity) ->setPrice($producto->price); $items[] = $item; $subtotal += $producto->quantity * $producto->price; } $item_list = new ItemList(); $item_list->setItems($items); $details = new Details(); $details->setSubtotal($subtotal) ->setShipping(1); $total = $subtotal + 1; $amount = new Amount(); $amount->setCurrency($currency) ->setTotal($total) ->setDetails($details); $transaction = new Transaction(); $transaction->setAmount($amount) ->setItemList($item_list) ->setDescription('Pedido de prueba en mi Laravel App Store'); // Redirect se si completa il pagamento O si cancella $redirect_urls = new RedirectUrls(); $redirect_urls->setReturnUrl(\URL::route('payment.status')) ->setCancelUrl(\URL::route('payment.status')); $payment = new Payment(); $payment->setIntent('Sale') ->setPayer($payer) ->setRedirectUrls($redirect_urls) ->setTransactions(array($transaction)); try { $payment->create($this->_api_context); } catch (\PayPal\Exception\PPConnectionException $ex) { if (\Config::get('app.debug')) { echo "Exception: " . $ex->getMessage() . PHP_EOL; $err_data = json_decode($ex->getData(), true); exit; } else { die('Ups! Algo salió mal'); } } foreach($payment->getLinks() as $link) { if($link->getRel() == 'approval_url') { $redirect_url = $link->getHref(); break; } } // add payment ID to session, \Session::put('paypal_payment_id', $payment->getId()); if(isset($redirect_url)) { // redirect to paypal return \Redirect::away($redirect_url); } // se ci sono errori return \Redirect::route('cart-show') ->with('message', 'Ups! Error .'); } public function getPaymentStatus(Request $request) { // Get the payment ID before session clear $payment_id = \Session::get('paypal_payment_id'); // clear the session payment ID \Session::forget('paypal_payment_id'); $payerId = \Input::get('PayerID'); $token = \Input::get('token'); if (empty($payerId) || empty($token)) { return \Redirect('products') ->with('message', 'Hubo un problema al intentar pagar con Paypal'); } $payment = Payment::get($payment_id, $this->_api_context); $execution = new PaymentExecution(); $execution->setPayerId(\Input::get('PayerID')); $result = $payment->execute($execution, $this->_api_context); if ($result->getState() == 'approved') { //$this->saveOrder(); $this->saveOrder($request); \Session::forget('cart'); return \Redirect('orderComplete') ->with('message', 'Compra realizada de forma correcta'); } return \Redirect('orderComplete') ->with('message-error', 'La compra fue cancelada'); } protected function saveOrder(Request $request) { $subtotal = 0; $cart = \Session::get('cart'); $shipping = 1; foreach($cart as $producto){ $subtotal += $producto->quantity * $producto->price; } //$cellulare =$request->get('fullname_ship'); $order = Order::create([ 'subtotal' => $subtotal, 'shipping' => $shipping, 'fullname_ship' => $request->get('fullname_ship'), //'user_id' => \Auth::user()->id ]); foreach($cart as $producto){ $this->saveOrderItem($producto, $order->id); } } protected function saveOrderItem($producto, $order_id) { OrderItem::create([ 'price' => $producto->price, 'quantity' => $producto->quantity, 'product_id' => $producto->id, 'order_id' => $order_id ]); } } 

RUTAS.PHP

 Route::post('payment', array( 'as' => 'payment', 'uses' => 'PaypalController@postPayment', )); Route::get('payment', array( 'as' => 'payment', 'uses' => 'PaypalController@getPayment', )); Route::get('payment/status', array( 'as' => 'payment.status', 'uses' => 'PaypalController@getPaymentStatus', )); 

Parece que estás obteniendo fullname_ship vacío aquí:

 fullname_ship' => $request->get('fullname_ship'), 

Por lo tanto, debe validar la entrada y decirle a un usuario que complete este campo (con required ). O puede establecer un valor predeterminado (si está vacío, se usará el valor predeterminado). O puede marcar este campo como nullable en DB y está vacío, no obtendrá un error.

La forma más sencilla es agregar elementos required al elemento de formulario:

  

$request->get('fullname_ship') no funcionará con Laravel 5.

Desde Laravel 5.0, hasta el valor actual de 5.2, las formas correctas de obtener un formulario de entrada son:

 $request->input('fullname_ship') or Input::get('fullname_ship') 

La segunda forma solo funcionará si use Input; en la parte superior del controlador.

Consulte esto si necesita algo más.

El mismo objeto de Request no se pasará a todas sus funciones en un controlador.

Debe leer el valor de fullname_ship dentro de la función postPayment() .

De lo contrario, puede pasar todos los datos desde $request a sus otras funciones

 public function postPayment(Request $request) { ... $input = $request->all(); ... $this->getPaymentStatus($input); ... } public function getPaymentStatus ($input) { ... $fullname_ship = $input['fullname_ship']; ... } 

Soluciono el problema, agregué todas las entradas de valores en el carrito de la sesión, así que en el método saveOrder obtengo todas las entradas de la sesión y el almacenamiento en mi base de datos. Después de guardar orden borré el carro de la sesión. ¡Gracias por todos los chicos!