লারাভেল সুস্পষ্ট গোষ্ঠী দ্বারা () এবং প্রতিটি গ্রুপের গণনাও ফেরত


114

আমার কাছে একটি টেবিল রয়েছে যা অন্যান্য কলামগুলির মধ্যে রয়েছে ব্রাউজার সংস্করণের একটি কলাম। এবং আমি কেবল রেকর্ড-সেট থেকে জানতে চাই, প্রতিটি ব্রাউজারের মধ্যে কতটি রয়েছে। সুতরাং, আমার এইরকম কিছু দিয়ে শেষ করা দরকার: মোট রেকর্ডস: 10; ইন্টারনেট এক্সপ্লোরার 8: 2; ক্রোম 25: 4; ফায়ারফক্স 20: 4. (সমস্ত 10 পর্যন্ত যোগ করা)

এখানে আমার দুটি পেন্স:

$user_info = Usermeta::groupBy('browser')->get();

অবশ্যই এতে রয়েছে 3 টি ব্রাউজার এবং প্রতিটিটির সংখ্যা নয়। কিভাবে আমি এটি করতে পারব?

উত্তর:


223

এটি আমার পক্ষে কাজ করছে:

$user_info = DB::table('usermetas')
                 ->select('browser', DB::raw('count(*) as total'))
                 ->groupBy('browser')
                 ->get();

4
দুর্দান্ত! সবেমাত্র 'ব্রাউজার' সিলেক্টে যুক্ত করুন: নির্বাচন করুন ('ব্রাউজার', ...) এবং প্রয়োজনীয় সমস্ত কিছু পেয়েছেন। আপনি ভাল, আপনি! youtube.com/watch?v=ravi4YtUTxo
কেজেমেসি

ধন্যবাদ তবে ব্যবহারকারীর মতো মডেলগুলি ব্যবহার করার সময় কেন এটি কাজ করে না: ('দেশ', ডিবি :: কাঁচা ('গণনা (*) মোট হিসাবে') -> অন্যান্য ম্যাথডস ()?
ডনক্যাডভোনা

4
+ ভি। কন্ট্রোলারগুলিতে DB এর পরিবর্তে \ DB ব্যবহার করুন
অমিত বেরা

@ অমিতবেরা আপনি কারণটি ব্যাখ্যা করতে পারেন? দয়া করে
জে কার্লোসআর

8
আপনি DB::table('usermetas')->..বেশি পছন্দ করার কোনও বিশেষ কারণ আছে কি Usermeta::..?
আদম

35

এটি আমার পক্ষে কাজ করে (লারাভেল ৫.১):

$user_info = Usermeta::groupBy('browser')->select('browser', DB::raw('count(*) as total'))->get();

23

ধন্যবাদ আন্তোনিও,

আমি listsকমান্ডটি কেবল শেষে যুক্ত করেছি যাতে এটি কেবল কী এবং গণনা সহ একটি অ্যারে প্রদান করবে:

লারাভেল 4

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->lists('total','browser');

লারাভেল 5.1

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->lists('total','browser')->all();

লারাভেল 5.2+

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->pluck('total','browser')->all();

4
ধন্যবাদ একটি নোট: -> 5.1 উদাহরণে সমস্ত () অপসারণ করা উচিত, যেহেতু আপনি ইতিমধ্যে ফলাফলগুলি তালিকাভুক্ত করেছেন।
পিম



9

সেভাবে কাজ করে, আরও কিছুটা পরিপাটি। getQuery()কেবল অন্তর্নিহিত নির্মাতাকে ফিরিয়ে দেয়, এতে ইতিমধ্যে সারণী উল্লেখ রয়েছে।

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');

5
  1. খোলা config/database.php
  2. সংযোগ সেটিংসের strictভিতরে কীটি সন্ধান করুনmysql
  3. মান সেট করুন false

1

এটি দিয়ে চেষ্টা করুন

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))

4
যদিও এটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এবং সম্ভবত ওপিএস কোডটিতে কী সমস্যা ছিল তা ব্যাখ্যা করা ভাল।
পিরহো

1

কাঁচা বক্তব্য ব্যবহার না করে গ্রুপ হ্যান্ডেল করার আরও লারাভেল উপায় এখানে।

$sources = $sources->where('age','>', 31)->groupBy('age');

$output = null;
foreach($sources as $key => $source) {
    foreach($source as $item) {
        //get each item in the group
    }
    $output[$key] = $source->count();
}

8
এটি ক্ষুধার্ত স্মৃতি এবং প্রক্রিয়াজাতকরণ।
doncadavona

আমার জন্য একই মেমরি পিবি
ভিনস

0
$post = Post::select(DB::raw('count(*) as user_count, category_id'))
              ->groupBy('category_id')
              ->get();

এটি বিভাগ দ্বারা পোস্টের গণনার ফলাফলের একটি উদাহরণ।


0

যদি আপনি সাজানো ডেটা পেতে চান তবে এটিও ব্যবহার করুন

$category_id = Post::orderBy('count', 'desc')
                     ->select(DB::raw('category_id,count(*) as count'))
                     ->groupBy('category_id')
                     ->get();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.