Laravel 5.1-错误存储表单数据,


Laravel 5.1 - Error storage form data,

我在请求表单After payment paypal的存储数据上有问题。这是我的错误

SQLSTATE[23000]:违反完整性约束:1048列"fullname_ship"不能为null(SQL:插入到orderssubtotalshippingfullname_shipupdated_atcreated_at)值(10,1,2016-05-09 15:39:40,2016-05-0915:39:40atr)

型号订单.PHP

<?php
namespace dixard;
use Illuminate'Database'Eloquent'Model;
class Order extends Model
{

    protected $table = 'orders';

    protected $fillable = [
    'subtotal',
    'shipping',
    'fullname_ship',


    ];
}

结账页面-ORDER-DETAIL.PHP

<form class="login" method="post" action="{{url('payment')}}">
 {{csrf_field()}}
    <div class="checkout-wrapper">
        <div class="container">
            <div class="text-alert">
                <p>Returning customer? <a href="#">Click here to login</a></p>
            </div><!-- /.text-alert -->
            <div class="row">
                <div class="col-md-6">
                    <h2>Fatturazione</h2>

                    <fieldset id="billinfo">
                    <div class="row">
                        <div class="col-md-6">
                            <div class="form-group">
                                <label for="fullname_ship">Nome e cognome<sup>*</sup></label>
                                <input type="text" class="form-control dark" id="fullname_ship" placeholder="Nome" name="fullname_ship" >
                            </div><!-- /.form-group -->
                        </div>

                    </div>
                    <div class="row">
                        <div class="col-md-6">
                            <div class="form-group">
                                <label for="address_shipping">Indirizzo <sup>*</sup></label>
                                <input type="text" class="form-control dark" id="address_shipping" placeholder="Via/Piazza/Viale" >
                            </div><!-- /.form-group -->
                        </div>
                        <div class="col-md-6">
                            <div class="form-group">
                                <label for="address2_shipping">Interno/Scala <sup>*</sup></label>
                                <input type="text" class="form-control dark" id="address2_shipping" placeholder="ScalaA/Interno:11" >
                            </div><!-- /.form-group -->
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-6">
                            <div class="form-group">
                                <label for="province_shipping">Provincia<sup>*</sup></label>
                                <input type="text" class="form-control dark" id="province_shipping" placeholder="Roma,Milano,ecc" >
                            </div><!-- /.form-group -->
                        </div>
                        <div class="col-md-6">
                            <div class="form-group">
                                <label for="country_shipping">Paese<sup>*</sup></label>
                                <input type="text" class="form-control dark" id="country_shipping" placeholder="Paese" value="" >
                            </div><!-- /.form-group -->
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-6">
                            <div class="form-group">
                                <label for="email_shipping">Email<sup>*</sup></label>
                                <input type="text" class="form-control dark" id="email_shipping" placeholder="Email" value="{{Auth::user()->email}}" >
                          </div><!-- /.form-group -->
                        </div>
                        <div class="col-md-6">
                            <div class="form-group">
                                <label for="phone_shipping">Cellulare<sup>*</sup></label>
                                <input type="text" class="form-control dark" id="phone_ship" placeholder="Telefono/Cellulare" name="phone_ship" >
                            </div><!-- /.form-group -->
                        </div>
                    </div>
                    </fieldset>
<form>

PAYPALCONTROLLER.PHP

<?php
namespace dixard'Http'Controllers;
use Illuminate'Http'Request;
use dixard'Http'Requests;
use dixard'Http'Controllers'Controller;


use Illuminate'Foundation'Bus'DispatchesCommands;
use Illuminate'Routing'Controller as BaseController;
use Illuminate'Foundation'Validation'ValidatesRequests;


use PayPal'Rest'ApiContext;
use PayPal'Auth'OAuthTokenCredential;
use PayPal'Api'Amount;
use PayPal'Api'Details;
use PayPal'Api'Item;
use PayPal'Api'ItemList;
use PayPal'Api'Payer;
use PayPal'Api'Payment;
use PayPal'Api'RedirectUrls;
use PayPal'Api'ExecutePayment;
use PayPal'Api'PaymentExecution;
use PayPal'Api'Transaction;
use dixard'Order;
use dixard'OrderItem;
class PaypalController extends BaseController
{
    private $_api_context;
    public function __construct()
    {
        // setup PayPal api context
        $paypal_conf = 'Config::get('paypal');
        $this->_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
        ]);
    }
}

ROUTES.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',
));

这里的fullname_ship似乎是空的:

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

因此,您应该验证输入并告诉用户填写此字段(使用required)。或者您可以将默认值设置为它(如果它为空,则使用dafault值)。或者您可以在DB中将此字段标记为nullable,并且它为空,您不会收到错误。

最简单的方法是将required添加到表单元素:

<input required="required" type="text" class="form-control dark" id="fullname_ship" placeholder="Nome" name="fullname_ship" >

$request->get('fullname_ship')将无法与Laravel 5一起使用。

从Laravel 5.0到5.2的当前值,获得表单输入的正确方法是:

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

第二种方法只有在控制器顶部use Input;时才有效。

如果你需要其他东西,请参考这个。

同一个Request对象不会传递给控制器中的所有函数。

您应该读取postPayment()函数本身内部的fullname_ship值。

否则,您可以将$request中的所有数据传递给其他函数

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

我解决了这个问题,我在会话推车上添加了所有值输入,所以在方法saveOrder中,我从会话和数据库中的存储中获取所有输入。保存订单后,我删除了会话购物车。谢谢大家!