سلام وقت بخیر
ببخشید من یه وب دارم که ماهنامه ها رو میخوام داخلش بزارم
یه آرشیو دارم مال سال 97 و یه سری هم مال سال 98 یعنی 6 ماه گدشته
حالا میخوام یه صفحه درست کنم به اسم بایگانی آرشیو یا هر چیز دیگه ای
میخوام وقتی وارد صفحه آرشیو میشم
به شکلی که میگم برای آرشیو کنه
مثلا بزنه
آرشیو سال 97
روش که کلیک کردم تمام pdf های سال 97 بیاد
و یه آرشیوم برای سال 98 ایجاد کنه و این 6 ماه رو بریزه داخلش
و وقتی سال 98 به اسفند رسیدیم تموم شد خودکار یکی برای 99 ایجاد کنه
چطور اینو میتونم درست کنم؟
درود
بسادگی با الکوئنت یا کوئری بیلدر میتونید این کارو انجام بدید
شما به کد SQL ای شبیه زیر احتیاج دارید، مثلا برای جدول posts:
select
year(created_at) year,
count(*) posts
from posts
group by year;
که اگر بخواهیم با الکوئنت همین کوئری رو بزنیم به شکل زیر میشه:
App/Post::selectRaw('
year(created_at) year,
count(*) posts
')->groupBy('year')
->get()
->toArray();
برای نمایش آرشیو مربوط به هر سال میتونید از بدنه درخواست (body of request).. سال و ماه مورد نظر برای اعمال تفکیک رو، از Querystring دریافت کنید.. یعنی هر گزینه آرشیو لینکی داشته باشه شبیه زیر:
http://domain/archive/?year=1398
سپس در کنترلر برای تشخیص این دادهها به شکل زیر (توجه داشته باشید که الکوئنت متدی به نام whereYear هم داره که در اینجا ازش استفاده میکنیم):
$posts = Post::latest();
if ($year = request('year')) {
$posts->whereYear('created_at', $year)
}
اگر قصد دارید چنین آرشیوی بسازید پیشنهاد میکنم قابلیت تفکیک به صورت ماهانه هم داشته باشید
موفق باشید
شاید پاسخ شما همینجا باشد
درود.
در سینتکس SQL میتونیم به اطلاعاتی که میخواهیم اصطلاحا یه Alias بدیم. یا یه نام که میشه با اون در جاهای دیگه کوئری شروطی رو نوشت.. مثلا در این حالت به جای اینکه نام ستون رو created_at برگردونه.. به نام year برمیگردونه
در نظر بگیرید کوئری بالا در واقع شبیه زیره:
select
year(created_at) AS year,
count(*) AS posts
...
حالا این AS آپشنال هست و میتونیم استفاده هم نکنیم
@ali.bayat
خیلی عالی و کامل
ممنون
@solmaz.ranji
همون روش بالاست ولی کمی عوض میشه:
کوئری:
App/Post::selectRaw('
year(created_at) year,
month(created_at) month,
count(*) posts
')->groupBy('year', 'month')
->get()
->toArray();
کنترلر:
$posts = Post::latest();
if ($year = request('year')) {
$posts->whereYear('created_at', $year)
}
if ($month = request('month')) {
$posts->whereMonth('created_at', $month)
}
$posts = $posts->get();
کنترلر فقط یک مثاله و روش های تمیز تری هم هست