سلام و احترام
public function userHoursSavedChart($user = null)
{
$user_id = (is_null($user)) ? Auth::user()->id : $user;
$users = Content::select(DB::raw("sum(words) as data"), DB::raw("MONTH(created_at) month"))
->whereYear('created_at', $this->year)
->where('user_id', $user_id)
->groupBy('month')
->get()->toArray();
$data = [];
for($i = 1; $i <= 12; $i++) {
$data[$i] = 0;
}
foreach ($users as $row) {
$month = $row['month'];
$data[$month] = intval($row['data']);
}
return $data;
}
این کد اطلاعات را برای سال جاری میلادی برای هر ماه از دیتایس میگیرد و مرتب میکند.میخوام برای سال شمسی و ماههای شمسی باشه. لطفا راهنمایی کنید
برای اینکه این کد اطلاعات را برای سال شمسی و ماههای شمسی مرتب کند، باید چند تغییر اساسی انجام دهید:
1.استفاده از تاریخ شمسی:
برای کار با تاریخ شمسی در PHP، شما میتوانید از کتابخانههایی مانند jdf
یا Morilog\Jalali
استفاده کنید. این کتابخانهها قادر به تبدیل تاریخ میلادی به شمسی هستند.
در ادامه، کد شما را اصلاح میکنم که تاریخها را به تاریخ شمسی تبدیل کند و دادهها را بر اساس ماههای شمسی گروهبندی کند:
use Morilog\Jalali\Jalalian; // اگر از این کتابخانه استفاده میکنید
public function userHoursSavedChart($user = null)
{
$user_id = (is_null($user)) ? Auth::user()->id : $user;
// دریافت دادهها بر اساس سال میلادی
$users = Content::select(DB::raw("sum(words) as data"), DB::raw("MONTH(created_at) month"), DB::raw("YEAR(created_at) year"))
->whereYear('created_at', $this->year) // سال میلادی
->where('user_id', $user_id)
->groupBy(DB::raw("YEAR(created_at), MONTH(created_at)"))
->get()->toArray();
// آرایهای برای ذخیره دادهها
$data = [];
// حلقهای برای پر کردن آرایه با صفر
for($i = 1; $i <= 12; $i++) {
$data[$i] = 0;
}
// تبدیل ماههای میلادی به شمسی و پر کردن دادهها
foreach ($users as $row) {
// تبدیل ماه میلادی به ماه شمسی
$month = $row['month'];
// تبدیل سال میلادی به شمسی
$year = $row['year'];
// تبدیل تاریخ میلادی به شمسی
$date = Jalalian::fromCarbon(Carbon::create($year, $month, 1)); // اولین روز از ماه میلادی به شمسی تبدیل میشود
$shamsiMonth = $date->month;
// ذخیره دادهها برای ماه شمسی
$data[$shamsiMonth] = intval($row['data']);
}
return $data;
}
توضیحات:
استفاده از Morilog\Jalali
:
برای استفاده از این کتابخانه، باید آن را در پروژه خود نصب کنید. میتوانید از طریق کامند زیر آن را نصب کنید:
composer require morilog/jalali
تبدیل تاریخ میلادی به شمسی:
با استفاده از کلاس Jalalian
تاریخ میلادی را به شمسی تبدیل میکنیم. برای هر دادهی که از پایگاه داده گرفته میشود، تاریخ میلادی مربوطه به تاریخ شمسی تبدیل میشود و بر اساس ماه شمسی دادهها گروهبندی میشود.
آرایه دادهها:
در این کد، دادهها به صورت یک آرایهی 12 عنصری نگهداری میشوند که هر عنصر آن مربوط به ماه شمسی است. در نهایت این دادهها به خروجی ارسال میشود.
با این تغییرات، کد شما اکنون به طور صحیح دادهها را بر اساس ماههای شمسی مرتب خواهد کرد.
این کد الان باگ داره. چون اطاعات سال جاری میلادی را میگیرد نه شمسی را. مثلا اگر فروردین درخواست ارسال شود، بجز اطلاعات فروردین، اطلاعات دی و بهمن و اسفند سال قبل را هم برمیگرداند چون شروع سال میلادی دیماه است. ضمنا از کتابخانه jdfاستفاده میکنم.
سلام آرمین عزیز.
خیلی سادهست. اگه درست متوجه شده باشم: شما یه تاریخ داری که توی دیتابیس به میلادی ثبت شده. یه ui هم داری مثل فرم که کاربر باید اونجا تاریخی که میخواد رو وارد کنه. حالا یا ui یا هرچیز. به هرحال از یه جایی باید یه دیتایی بیاد که وارد کوئری بشه که فیالمثل ما اینجا همون فُرم رو در نظر میگیریم.
کاربر که تاریخ رو به شمسی وارد کرد، سمت لاجیکت تاریخِ ورودیه فرم رو میگیری و تبدیلش میکنی به میلادی. بعد از تبدیل، از اون تاریخِ تبدیل شدهی میلادی برای کوئریت استفاده میکنی..
حالا وقتی نتیجه از سمت دیتابیس برگشت، مجدد به تاریخ شمسی تبدیلش میکنی و به کاربر نمایش میدی.
با همه کتابخونهها میتونی این کار رو انجام بدی. carbon یا morilog یا verta یا ....
اگر هم کالمنهای دیتابیستون به نحوی طراحی شده که مثلا ماه و سال جدا جدا توشن یا در کل از یکی از اجزای تاریخ برای انجام یک کار استفاده میکنید (مثلا فقط ماه، فقط سال)، میتونید از توابعی که توی خود کتابخونه ها هستن برای گرفتن اون فیلد استفاده کنید. مثال توی موریلوگ یا کربن وقتی تاریخ رو میگیری، اینطوری میزنی: carbon::pars()->format(Y). یا فکر کنم توی جیدیاف miladi2shamsi یا یه همچین تابعی هست.
اگه هم منظورت یه چیز دیگهست، بگو تا به کمک هم حلش کنیم.
موفق باشی
اطلاعاتی که برمیگردد در یک چارت نمایش داده میشود. اطلاعات: تعداد ایمیلهای ارسال شده(هر کاربر) سال جاری به تفکیک تعداد در هر ماه. میخوام این اطلاعات بصورت شمسی باشد. از فروردین تا اسفند سال جاری شمسی. مثلا
فروردین 24
اردیبهشت 27
خرداد 42
و...
البته تعداد از دیتابیس گرفته میشه
خب آرمان جان در این صورت اصلا نیازی نیست که از کتابخونهها استفاده کنی.
در حقیقت من هنوز نمیدونم دقیقا از دیتابیس چه چیزی داره برمیگرده. اگه اینطوریه که از کوئری نتیجهای مثل نوامبر، آگوست و ... برمیگرده، خب میتونی یه فانکشن بنویسی براش.
یه فانکشن بنویس مثل فانکشن زیر:
function convertToPersianMonth($englishMonth) {
$map= [
'January' => 'دی',
'February' => 'بهمن',
'March' => 'اسفند',
]
}
اینجا هر ورودیای ک بگیره، معادلشو برات برمیگردونه.
اگه هم عدد میاد، دوباره میتونی همین کار رو باهاش انجام بدی. مثلا اگه از دیتابیس به جای ژانویه که ماه اوله، عدد ۱ برمیگرده. میتونی توی آرایه بزاری ۱ مساویه با فروردین.
اگه بازم اونی نبود که میخوای، اطلاع بده
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟