সম্পর্কের কলামের লারাভেল সুস্পষ্ট যোগফল


111

আমি একটি শপিংকার্ট অ্যাপ্লিকেশন নিয়ে কাজ করছি এবং এখন আমি নিম্নলিখিত বিষয়টিতে এসেছি ..

একটি ব্যবহারকারী, একটি পণ্য এবং একটি কার্ট অবজেক্ট আছে।
- কার্ট টেবিলটিতে কেবলমাত্র নিম্নলিখিত কলামগুলি রয়েছে: "আইডি", "ব্যবহারকারী_আইডি", "পণ্য_আইডি" এবং টাইমস্ট্যাম্পগুলি।
- ইউজারমোডেলটিতে "অনেকগুলি" কার্ট রয়েছে (কারণ কোনও ব্যবহারকারী একাধিক পণ্য সংরক্ষণ করতে পারেন)।
- কার্টমোডেলটি একজন ব্যবহারকারী এবং কার্টমোডেলটিতে "অনেকগুলি" পণ্য রয়েছে।

এখন মোট পণ্য আমি শুধু কল করতে পারেন গণনা করতে: Auth::user()->cart()->count()

আমার প্রশ্নটি: আমি কীভাবে এই ব্যবহারকারীর দ্বারা গাড়িতে থাকা পণ্যগুলির দামগুলি (পণ্যের কলাম) পেতে পারি?
আমি এটিকে বাছাইয়ের সাথে অর্জন করতে চাই এবং কোয়েরি ব্যবহার করে নয় (মূলত কারণ আমি বিশ্বাস করি যে এটি অনেক বেশি পরিষ্কারক)।

উত্তর:


220
Auth::user()->products->sum('price');

কিছু Collectionপদ্ধতির জন্য ডকুমেন্টেশনটি সামান্য হালকা তবে সমস্ত ক্যোয়ারী নির্মাতাদের সমষ্টি আপাতদৃষ্টিতে উপলভ্য ছাড়াও avg()এটি পাওয়া যেতে পারে http://laravel.com/docs/queries#aggregates এ


বাহ তাড়াতাড়ি উত্তরের জন্য ধন্যবাদ। এটি এখন কেবল বলেছে কোনও দামের কলাম নেই। দেখে মনে হচ্ছে
বুদ্ধিমানরা

3
আসলে এটি অর্থবোধ করে, আপনাকে সম্পর্কের সাথে পণ্য সারণী যুক্ত করতে হবে, দুঃখিত। $sum = Auth::user()->cart()->products()->sum('price');আপনার পণ্যের টেবিলে দাম কলামটি যাই হোক না কেন চেষ্টা করুন ।
ব্যবহারকারী 1669496

1
আমার জন্য কাজ! আমি কার্ট ক্লাস ব্যবহার বন্ধ করে দিয়েছি। ব্যবহারকারী এবং পণ্য উভয়েরই এখন একটি টোটোম্যানি () পদ্ধতি রয়েছে। এখন আমি দামটি ব্যবহার করতে সক্ষম হয়েছি: uth uth আথ :: ব্যবহারকারী () -> পণ্য-> যোগফল ('দাম')} থ্যাঙ্কস, এই কেসটি সমাধান হয়েছে।
এ্যাডমিরাল

9
এখানে কিছু ঠিক নেই - আপনার লিঙ্কটি ডেটাবেস ক্যোয়ারীতে সামগ্রিক ফাংশন প্রয়োগ করে, তবে products->sumবোঝায় যে এটি পণ্য সংগ্রহ () দ্বারা ফিরিয়ে দেওয়া বিল্ডার অবজেক্টের পরিবর্তে সংগ্রহ সামগ্রীতে কল সমষ্টি call আপনি এখানে কোনটি বোঝাতে চাইছেন তা স্পষ্ট করে দেওয়া এবং আদর্শভাবে উভয়কে ব্যাখ্যা করার জন্য একটি লিঙ্ক সরবরাহ করুন।
বেনুবার্ড

1
@ ব্যবহারকারী3253002 বন্ধনী ছাড়া সম্পর্ক ব্যবহার ...->products->...করে বর্তমান মডেলের সম্পর্কিত সমস্ত পণ্য পেতে ডেটাবেসকে জিজ্ঞাসা করবে এবং তারপরে সেই মেমোরি সংগ্রহের সাথে কাজ করবে। ব্যবহার ...->products()->...শুধু ভালো কিছু হওয়া পর্যন্ত নির্বাহ ছাড়া ক্যোয়ারী হচ্ছে বিল্ড পরিবর্তন ->sum()called.The পরেরটির, আরও দক্ষ হতে পারে যেমন মেমরিতে ডাটাবেস থেকে অপ্রয়োজনীয় তথ্য হস্তান্তর এড়াতে হয়।
Siegen

62

এটি আপনার উত্তর নয় তবে অন্য সমস্যার সমাধানের জন্য এখানে যারা এসেছেন তাদের জন্য। আমি শর্তাধীনভাবে সম্পর্কিত টেবিলের একটি কলামের যোগফল পেতে চাই। আমার ডাটাবেসে ডিলের অনেকগুলি ক্রিয়াকলাপ রয়েছে আমি ক্রিয়াকলাপ টেবিল থেকে "পরিমাণ_টোটাল" এর যোগফল পেতে চেয়েছিলাম যেখানে ক্রিয়াকলাপ.ডিয়াল_আইডি = ডিলইড এবং ক্রিয়াকলাপের স্ট্যাটাস = প্রদত্ত তাই আমি এটি করেছি।

$query->withCount([
'activity AS paid_sum' => function ($query) {
            $query->select(DB::raw("SUM(amount_total) as paidsum"))->where('status', 'paid');
        }
    ]);

এটি ফিরে আসে

"paid_sum_count" => "320.00"

ডিলস অ্যাট্রিবিউট ইন।

এটি এখন যোগফলটি আমি গণনাটি পেতে চাইনি।


3
এটি অনেক ক্ষেত্রে সেরা কারণ আপনি সমস্ত রেকর্ড না পেয়েই এটি অনুসারে বাছাই করতে পারেন।
সাব্রিনা লেগেট

15

আমি অনুরূপ কিছু করার চেষ্টা করেছি, যা সংগ্রহ () ফাংশনটি বের করার আগে আমাকে অনেক সময় নিয়েছিল। সুতরাং আপনি এইভাবে কিছু পেতে পারেন:

collect($items)->sum('amount');

এটি আপনাকে সমস্ত আইটেমের যোগফল দেবে।


4
ফাংশনের নামটি আসলেcollect()
লিওনার্দো বিলের

আপনি অ্যারে লুপিং থেকে সম্ভবত ভাল। collect()একটি সংগ্রহ বস্তুর মধ্যে একটি অ্যারের সমৃদ্ধ করতে ব্যবহৃত হয়, তবে যদি আপনার প্রথম স্থানটিতে কোনও সংগ্রহ না থাকে তবে কেবল কাঁচা অ্যারে ব্যবহার করা ভাল
শিখর

0

কোয়েরি বিল্ডারও ব্যবহার করছে

DB::table("rates")->get()->sum("rate_value")

সারণী হারের ভিতরে সমস্ত হারের সংমিশ্রণ পেতে।

ব্যবহারকারীর পণ্যগুলির সংমিশ্রণ পেতে।

DB::table("users")->get()->sum("products")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.