Laravel 5.8: 你能帮我解决这个问题吗

Laravel 5.8: Can you help me with this problem

我正在使用 Laravel 5.8 开发我的在线商店。在这家商店中,每个产品都有一个 prd_delivery 字段,可以设置这些值之一:

city_free_delivery

country_free_delivery

null

当为null时,表示没有任何免费送货类型。

而当用户select他们的产品时,必须应用这些情况:

请注意,行 City 表示,如果用户住在城市,行 Country 表示,如果他住在以外城市(村庄)。

这些情况适用于cart.blade.php,所以我尝试了这个:

@if($conflicting  && ($prd[0]->prd_delivery == 'country_free_delivery'))
    @php
        Session::forget('city');
        Session::forget('city_country');
        Session::put('country' , '1')
    @endphp
@endif

@if($conflicting  && ($prd[0]->prd_delivery == 'city_free_delivery'))
    @php
        Session::forget('country');
        Session::put('city' , '2');
    @endphp
@endif

@if($conflicting  && ($prd[0]->prd_delivery == 'city_free_delivery' || $prd[0]->prd_delivery == 'country_free_delivery'))
    @php
        Session::forget('country');
        Session::forget('city');
        Session::forget('free_notfree');
        Session::put('city_country' , '0');
        Session::put('free_notfree','13');
    @endphp
@endif

@if($conflicting  && ($prd[0]->prd_delivery == '' || $prd[0]->prd_delivery == 'city_free_delivery' || $prd[0]->prd_delivery == 'country_free_delivery'))
    @php
        if((session('free_notfree') != '13')){
            Session::forget('country');
            Session::forget('city_country');
            Session::put('free_notfree' , '3');
        }
    @endphp
@endif

在控制器中,我有这个:

$conflicting = false;
$free_delivery = '';

if ($foundOrder != null) {
  foreach ($foundOrder as $key => $value) {
    $product = Product::with('uploaded')->wherePrdId($value->id)->select('*')->first();

    // Just put a check here in case you have some non-free delivery types
    if ($product->prd_delivery == 'city_free_delivery' || $product->prd_delivery == 'country_free_delivery') {

      // Check if cart already have free delivery item and it conflict with current looping product or not
      if ($free_delivery && $free_delivery != $product->prd_delivery) {
        $conflicting = true;
      }

      $free_delivery = $product->prd_delivery;
    }

    $prds[] = [
       $product,
       $value->quantity,
       $value->price
    ];
  }
} else {
    $prds = [];
}
...
return view('frontend.shop.carts.index', compact('conflicting', ...));

所以通过这种方式我可以查看运费(可以免费或不免费),取决于用户位置和用户购物车产品。

例如在 checkout.blade.php,如果他的位置是 city,这将 运行

@if(Session()->has('city') || Session()->has('city_country') || Session()->has('country'))
    Free
@else
    {{ $item->price . ' Dollar'}}
@endif

最后,情况正常,但最后一个除外:

事实上,它向用户显示FREE,而{{ $item->price . ' Dollar'}}必须显示!

那么最后一种情况如何打印价格呢?

我知道这个问题有点令人困惑,但我已尽力以最好的方式解释问题。因为我对此很在意。

非常感谢你们的任何想法或建议。

提前致谢。

问题是您在循环内设置会话值,因此只应用最后一个循环值。有了这个要求,您可以创建一个数组来存储购物车中所有交付类型的产品,然后根据该数组设置会话值。并且您应该将会话设置逻辑放在控制器中,而不是视图中。

$delivery_types = [];
$conflicting = false;

if ($foundOrder != null) {
  foreach ($foundOrder as $key => $value) {
    $product = Product::with('uploaded')->wherePrdId($value->id)->select('*')->first();

    array_push($delivery_types, $product->prd_delivery);

    $prds[] = [
       $product,
       $value->quantity,
       $value->price
    ];
  }

  $delivery_types = array_unique($delivery_types);

  // Your conflicting check here
  if (in_array('country_free_delivery', $delivery_types) && in_array('city_free_delivery', $delivery_types)) {
     $conflicting = true;
  }

  // Free logic check here
  if (in_array(null, $delivery_types)) {
     Session::put('free' , 'no');
  } else if (in_array('country_free_delivery', $delivery_types)) {
     Session::put('free' , 'country');
  } else {
     Session::put('free' , 'city');
  }

} else {
    $prds = [];
}
...

然后在你的 checkout.blade.php:

@if (session('free') == 'no)
  {{ $item->price . ' Dollar'}}
@else
  // Depend on user's location
@endIf