سلام خوبیی
ببین به نظر میرسه که فیلد "courseid" و "paymentstatus" رو به عنوان شرط برای جستجو استفاده کردی ولی فک کنم متد where('payment_status','price')
کاربرد صحیحی نداره
احتمالاً بجای 'price'
باید یه مقدار دیگ رو در نظر بگیریم که مشخص کنه وضعیت پرداخت مورد نظر باشه مثلاً اگخ وضعیت پرداخت رو با استفاده از فیلدی به نام "status" در جدول تعریف کردی میتونی کد زیررو استفاده کنی
php
$count = Transaction::where('course_id', 20)->where('status', 'paid')->count();
اگه اون جواب نداد اینو بزن
$count = Transaction::where('courseid', 20)
->whereIn('paymentstatus', \['paid'\])
->count();
سلام دوست عزیز چیزی که شما میخواید خیلی ساده است اما کدی که دادید اگه بخوام از طریق اون راهنمایی کنم باید اطلاعات بیشتری داشته باشم اما با این حال فکر کنم توی where ها اشتباهی انجام دادی اومدی گفتی توی تراکنش ها بیاد و اونایی که course_id شون برابر با 20 هست رو بر گردونه خوب بعد توی اون دیتا ها دوباره بیاد و یه فیلتر دیگه هم اعمال بشه اونایی که payment_status برابر با price رو فقط بر گردون یه نگاه بنداز به دیتابیس ببین این دیتاهایی که فیلتر زدی با همچین نامی توی دیتابیس ذخیره کردی اخه این چیز ساده ای هست احتمالا توی اسم گذاری مشکل داری که 0 برمیگردونه اگه همچنان مشکل داشتی از کدت و مایگریشن جدول تراکنش ها عکس بده تا حداقل بتونم راهنماییت کنم
@FullStack
جدول تراکنش:
Schema::create('transactions', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->string('transaction_id')->nullable();
$table->string('course_id')->default('vip');
$table->string('price');
$table->string('payment_status');
$table->timestamps();
});
کد :
$count = Transaction::where('course_id', 20)->whereIn('payment_status', 'price')->count();
@Arshiamohammadei
کار نکرد
خوب دوست عزیز شما اومدی توی جدول transactions و course_id رو از جنس رشته در نظر گرفتی و مقدار پیشفرض رو هم vip در نظر گرفتی ولی موقعه کوئری بهش مقدار عددی دادی که برات پیدا کنه باید توی مقدار دادن ها دقت کنیتوی دیتابیس ببین مقدار course_id ها و payment_status ها چی هست ایا برابر با مقداری که میدی هست
ببینید این بخش رو پاک کنید و نتیجه رو ببینید
->whereIn('payment_status', 'price')
ببینید چی بر میگردونه اصلا جوابی بر میگردونه البته با این اطلاععات داخل دیتابیس هیچکدوم برابر با 20 نیست این اطلاعاتی بهش دادید با اطلاعات داخل دیتابیس برابری نمیکنه
یه کاری کن توی این جور مواقعه برنامه نویسا تست نویسی میکنن مثلا اول میان میگن
dd(Transaction::all()->count());
ببینن چن برمیگردونه اگه اوکی بود میرن مرحله بعد تا جایی که مشکل رو پیدا کنن از کدوم قسمت هست بعد مثلا
dd(Transaction::where('course_id ',20)->count());
هر قسمت که بهت صفر برگردوند یعنی اونجا مشکل داری باید اون قسمت بررسی بشه تا ببینیم مشکل چیه ولی اینطور که متوجه شدم مشکل از مقدار ها هست مثلا مقدار رو به صورت رشته توی دیتابیس توی فیلد دادی اما توی کوری به صورت عددی میخوای برات پیدا کنه اگه اون مقداری که توی جدول transactions دادی به course_id به صورت عددی باشه ممکنه مشکل رو حل کنه ولی باز یه سری تستا انجام بده مثلا ببین چه عددی توی دیتابیس هست course_id رو برابر با اون بده بعد ببین برگشت میده یا نه
@FullStack
تست نویسی رو می دونم
تست اول رو زدم عدد ۶ رو می برگردونه
یعنی یک خرید همان صفحه با user_id برابر ۲ بوده که حساب دومی براش ساخته شده, خرید انجام شده است.
@FullStack
مقدار ok ثبت می کنه
کد زیر نگاه کن:
public function result(Request $request)
{
$payment = Transaction::where('transaction_id',request('Authority'))->first();
$course = Course::findOrFail($payment->course_id);
if(request()->get('payment_status') == 'NOK') {
$request->session()->flash('payment_status' , false);
return redirect()->route('home.index');
}
$price = $payment->price;
try {
$receipt = Payment::amount($price)->transactionId(request()->Authority)->verify();
auth()->user()->transactions()->update([
'price'=> $price
]);
$payment->update([
'payment_status'=>'ok',
]);
$request->session()->flash('payment_status' , true);
if($this->AddUserForLearning($payment, $course)) {
return redirect()->route('single.course',$course->slug);
}
} catch (InvalidPaymentException $exception){
$request->session()->flash('payment_status' , false);
return redirect()->route('home.index', ['payment_status' => false]);
}
}
اها پس چرا موقعه کوری زدن این خط کد رو بهش اضافه کردی؟
->whereIn('payment_status', 'price')
whereIn میاد حالا مثلا یه آرایه میگیره و کاوش میکنه توی دیتابیس و فیلدی که تعریف کردی هر کدوم مقدارش با یکی از خونه های این آرایه بود رو به لیست اضافه میکنه
اصن مگه نمیخوای یه کوری بزنی که تعداد محصولات خریده شده هر کاربر رو بر گردونه حالا عددش رو نمایش بدی یا خود محصولات رو نمایش بدی؟
به جای این کارا میتونی یه جدول رابط بزنی بین یوزر ها و محصولات با نام دلخواه بعد ایدی محصول ایدی کاربر و زمان خرید و ... رو توش ذخیره کنی و با استفاده از روابط بیای بین کاربر و این جدول رابطه ایجاد کنی هر کاربر میتونه چندین محصول بخره و هر محصول خریده شده متعلق به یک کاربر بعد خیلی راحت میتونی یوزر رو در بیاری و به این صورت میشه
user()->purchases()->count()
روابط برای همین کارا طراحی شدن که ازشون استفاده کنی نیای دوباره نویسی کنی و کار خودتو سخت تر کنی
@FullStack
این روشی که شما گفتی رو قبلا امتحان کردم که متاسفانه کل محصولات تعداد خرید یکسان نشون میده و یعنی اگر کاربر دیگر محصول خرید کنه به همه محصولات تعداد یک خرید رو ثبت می کنه نه برای کاربری که خرید انجام داده در همان صفحه محصول است...
ممکنه اشتباه کد نویسی خوب اخه لاراول یک قسمت نداره که بگی مشکل از اون قسمته حل میشه جداول هستن کد نویسی هست نوع داده هست باید همه اینا اول چک بشه اگه میخوای با برنامه anydesk میتونم وصل بشم کداتو ویرایش بزنم تست بزنم تا اوکی بشه
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟