• 27-09-2022, 04:50:52
    #1
    Merhaba,

    2 adet tablom var;

    product_orders ve product_orders_cart adında.

    Sipariş geldiği zaman kullanıcı bilgisi ve diğer bilgiler kayıt ediliyor.

    Satın aldığı ürünler product_orders_cart tablosuna kaydediliyor.

    Kullanıcı birden fazla ürün sipariş verebilir. Sipariş verdiği ürünler de parça parça teslim ediliyor.


    Listeleme sayfasında
    @if(count($payout->getCart) == $payout->getCart->sum('delivery_status'))
                                              <i class="fas fa-circle text-success"></i><small class="text-secondary"> Teslim Edildi</small>
                                          @else
                                              <i class="fas fa-circle text-danger"></i><small class="text-secondary"> Teslimat Bekliyor</small>
                                          @endif
    bu şekilde gösterebiliyorum.

    Ama filtreleme kısmını yapamadım.

    filter kullanarak yapabilirim ama pagination kısmı sorun çıkartacak.

    Veritabanı sorgusu olarak nasıl yapabilirim?

    Model ProductOrders:
    <?php
    
    namespace App\Models\Shop;
    
    use App\Models\members\Member;
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use \App\Models\Shop\ProductOrdersCart;
    use Carbon\Carbon;
    
    class ProductOrders extends Model
    {
        use HasFactory;
        protected $table  = 'product_orders';
        public function getCart(){
            return $this->hasMany(ProductOrdersCart::class, 'order_id','order_id');
        }
    
    
        public function scopeFilter($query, $dateFrom, $dateTo, $status)
        {    
            if (!empty($status)) {
                switch($status) {
                    case 'pending':
    
                        break;
                    case 'completed':
                        $query->where('status', '1');
    
                        break;
                    case 'failed':
                        $query->where('status', '0');
                        break;
                }
    
            }
    
    
            return $query;
        }
     
    }
    Controller:
            $payouts = ProductOrders::where('status',1)->orderBy('created_at','desc');
            $payouts->filter($request->input('from_date'), $request->input('to_date'),$request->input('status'));
            $payouts = $payouts->paginate(50);
  • 27-09-2022, 12:51:46
    #2
    ProductOrders ::where("filrelenecek_kolon", 1)->with('getCart')->paginate(10);
  • 27-09-2022, 12:58:10
    #3
    whereHas kullanmanız daha doğru olacaktır. Mobil olduğum için sorguyu yazamıyorum ama tüm ürünleri çekip filtre yapmanız doğru değil çünkü ürün arttıkça orası çıkılmaz bir hal alır.
  • 27-09-2022, 15:55:19
    #4
    Modelinizde şöyle bir scope tanımlayın;
    public function scopeIsDelivered($query, $value)
    {
        return $query->when($value, function ($q) use($value) {
            $q->whereHas('product_orders_cart', function ($q) use($value) {
                $q->having('product_orders_cart_count', ($value == 1 ? '=' : '>'), DB::raw('SUM(delivery_status)'));
            });
        });
    }
    Controller'ı düzenleyin;
    $payouts = ProductOrders::where('status', 1)
        ->withCount('product_orders_cart')
        ->filter(request('from_date'), request('to_date'), request('status'))
        ->isDelivered(request('delivery_status')) // 1 teslim edilenler, değilse teslim edilmeyenler
        ->orderBy('created_at','desc')
        ->paginate(50);
    Çalışıyor olması gerek.