Davood
5 سال پیش توسط Davood مطرح شد
8 پاسخ

ساخت صفحه آرشیو با php

سلام وقت بخیر
ببخشید من یه وب دارم که ماهنامه ها رو میخوام داخلش بزارم
یه آرشیو دارم مال سال 97 و یه سری هم مال سال 98 یعنی 6 ماه گدشته

حالا میخوام یه صفحه درست کنم به اسم بایگانی آرشیو یا هر چیز دیگه ای
میخوام وقتی وارد صفحه آرشیو میشم
به شکلی که میگم برای آرشیو کنه

مثلا بزنه
آرشیو سال 97
روش که کلیک کردم تمام pdf های سال 97 بیاد

و یه آرشیوم برای سال 98 ایجاد کنه و این 6 ماه رو بریزه داخلش

و وقتی سال 98 به اسفند رسیدیم تموم شد خودکار یکی برای 99 ایجاد کنه

چطور اینو میتونم درست کنم؟

@ali.bayat
@Alimotreb
@hesammousavi
@khanzadimahdi


ثبت پرسش جدید
محمدرضا کیانی
تخصص : توسعه دهنده وب و موبایل
@MoReKiani 5 سال پیش مطرح شد
1

سلام خسته نباشید
با کوئری می تونید اینکار رو انجام بدید و فقط لازمه که ببینید چه تایمی این اطلاعات وارد شده و یا اگه مشخص نیست از طریق ایدی باید ببینید که چه زمانی بارگزاری شده یعنی از ایدی 1 تا 50 تو سال 97 بوده بعد شما کوئری می زنید که از ایدی 1 تا 50 را تو آرشیو 97 نشان بده
کار سختی نیست


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
2

درود
بسادگی با الکوئنت یا کوئری بیلدر می‌تونید این کارو انجام بدید
شما به کد 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)
}

اگر قصد دارید چنین آرشیوی بسازید پیشنهاد می‌کنم قابلیت تفکیک به صورت ماهانه هم داشته باشید
موفق باشید


Davood
تخصص : PHP - Laravel
@dfardabasi 5 سال پیش مطرح شد
0

@ali.bayat

select 
    year(created_at) year,
    count(*) posts
from posts
group by year;

خیلی عذر میخوام میشه اون تیکه قبل از from posts رو برام توضیح بدید
مثلا کنار count(*) چرا posts رو نوشتید یا کنار year(created_at ) چرا year رو نوشتید؟؟؟؟


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

درود.
در سینتکس SQL می‌تونیم به اطلاعاتی که می‌خواهیم اصطلاحا یه Alias بدیم. یا یه نام که میشه با اون در جاهای دیگه‌ کوئری شروطی رو نوشت.. مثلا در این حالت به جای اینکه نام ستون رو created_at برگردونه.. به نام year برمی‌گردونه

در نظر بگیرید کوئری بالا در واقع شبیه زیره:

select 
    year(created_at) AS year,
    count(*) AS posts
...

حالا این AS آپشنال هست و می‌تونیم استفاده هم نکنیم


Davood
تخصص : PHP - Laravel
@dfardabasi 5 سال پیش مطرح شد
0

@ali.bayat
خیلی عالی و کامل
ممنون


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

خواهش می‌کنم
موفق باشید


soraal
تخصص : full stack web developer
@solmaz.ranji 4 سال پیش مطرح شد
0

اگه بخوایم به صورت ماهانه هم جدا کنیم باید چیکار کنیم؟


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

@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();

کنترلر فقط یک مثاله و روش های تمیز تری هم هست


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام