اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

يوجد في الحقيقة في لارافيل تابع يدعى whereMonth يمكن من عليه تحديد مدخلات شهر ما، فعلى سبيل المثال:

$transactions = Transaction::whereMonth('created_at', '09')
            ->get();

سيقوم بجلب كامل التحويلات التي تم انشاءها في شهر 9 الموافق لسبتمبر. 

بنفس المنطق سيمكنك ايضا استعمال التابع الآخر whereYear مع whereMonth لجلب مدخلات الشهر المرفق بالعام المرفق. يعني: هذا الشهر. يكون ذلك كـ:

$transactions = Transaction::whereMonth('created_at', '09')
            ->whereYear('created_at', '2022')
            ->get();

يمكنك جعل العملية ديناميكية عن طريق الدالة المساعدة now والتي تقوم بانشاء نسخة عن الصنف "Illuminate\Support\Carbon"  في الوقت الحالي:

$currentYear = now()->year;
$currentMonth = now()->month;

$transactions = Transaction::whereMonth('created_at', $currentMonth)
            ->whereYear('created_at', $currentYear)
            ->get();

بذات المنطق يمكنك تطبيقها على التحويلات الخاصة بالشهر لديك.

  • 0
نشر (معدل)

لقد قمت بعمل ذلك

Route::get('/monthly', function () {
    $time =   Carbon::today();
    $operation = DoctorProject::with('transactions', 'doctor:id,name', 'project:id,name')->whereHas('transactions', function ($query) {
        return $query->whereMonth('created_at', '06');
    },)->get();
    return view('monthly', [

        'operation' => $operation,
        'time' => $time
    ]);
})->middleware('auth');

في هذا الكود يظر لنا الProjects التي اضفنا لها transactions في شهر 6
ولكن

 @foreach ($operation as $op )
                @if($op->doctor->id == 1)
                
                
                <h5> <label><img src="/images/Arrow.svg" alt="clock"></label> اســـــم الـحــالــه ->
                    <a href="projects/{{ $op->project->id }}">{{
                        $op->project->name }}</a>
                    </h6>

                    @foreach ($op->transactions->where('created_at', '=', $time ) as $o )
                    <h5>
                        {{-- <label><img src="/images/money.svg" alt="clock"></label> --}}
                        💵 المبلع المدفوع :<span> EGP {{ $o->payed }}</span>
                       
                        <?php
                    $sum+= $o->payed;
                ?>
                        </h6>
                        @endforeach
                        @endif
                        @endforeach

في هذا الكود نريد اظهار الtransactions نفسها اللتى تمت في شهر 6
عن طريق created_at المخرنه في قاعدة البيانات

تم التعديل في بواسطة أحمد مصطفى كامل
  • 0
نشر
بتاريخ 28 دقائق مضت قال أحمد مصطفى كامل:

في هذا الكود يظر لنا الProjects التي اضفنا لها transactions في شهر 6
ولكن


 @foreach ($operation as $op )
                @if($op->doctor->id == 1)
                
                
                <h5> <label><img src="/images/Arrow.svg" alt="clock"></label> اســـــم الـحــالــه ->
                    <a href="projects/{{ $op->project->id }}">{{
                        $op->project->name }}</a>
                    </h6>

                    @foreach ($op->transactions->where('created_at', '=', $time ) as $o )
                    <h5>
                        {{-- <label><img src="/images/money.svg" alt="clock"></label> --}}
                        💵 المبلع المدفوع :<span> EGP {{ $o->payed }}</span>
                       
                        <?php
                    $sum+= $o->payed;
                ?>
                        </h6>
                        @endforeach
                        @endif
                        @endforeach

في هذا الكود نريد اظهار الtransactions نفسها اللتى تمت في شهر 6
عن طريق created_at المخرنه في قاعدة البيانات

هل حاولت استعمال التابع whereMonth هنا أيضا؟

مثلا:

$op->transactions->whereMonth('created_at', now()->month )->get()

لا تنسى تنفيذ الاستعلام عن طريق التابع get. يحتمل ان يكون هو مسبب المشكلة التي تحاول تفاديها:

اقتباس

هذا الكود لا يخرج لي اي بيانات كلها null مع العلم انه يوجد بيانات في Database

كملاحظات أخرى،

من غير المقترح كتابة استعلامات قواعد بيانات في مكان غير النماذج Models. فهو تطبيق غير جيد ويضفي على الشيفرة الكثير من مشاكل عدم قابلية التوسع والقراءة ونظافة الشيفرة وغيرها.

ان كنت تحاول جلب التحويلات الخاصة بعملية ما في هذا الشهر فسيكفيك تعريفها ضمن ملف النموذج واستعمالها بشكل عادي في ملف العرض:

class Operation extends Model {
  ..

  public function transactionsOfThisMonth()
  {
       return $this->transactions->whereMonth('created_at' ,now()->month)->get();
  }

}

ثم سيسعك استعمالها بشكل عادي كـ:

@foreach($op->transactionsOfThisMonth() as $t )

ثالثا، لما تقوم بوضع الشيفرة كاملة داخلة عبارة شرطية if، لما لا تستعمل فقط متغير القالب continue الذي سيتحقق من الشرط في كل حلقة من التكرار ويجعل التكرار يستمر في حالة تحقق الشرط وفقط؟

@foreach ($operation as $op )
   @if($op->doctor->id == 1) @continue @endif
       <h5> <label><img src="/images/Arrow.svg" alt="clock"></label> اســـــم الـحــالــه ->
                    <a href="projects/{{ $op->project->id }}">{{
                        $op->project->name }}</a>
                    </h6>

                    @foreach ($op->transactions->where('created_at', '=', $time ) as $o )
                    <h5>
                        {{-- <label><img src="/images/money.svg" alt="clock"></label> --}}
                        💵 المبلع المدفوع :<span> EGP {{ $o->payed }}</span>
                       
                        <?php
                    $sum+= $o->payed;
                ?>
                        </h6>
                        @endforeach
@endforeach

نفس الشيء بالنسبة للمتغير sum، افترض أنك تقوم بتجميع كامل المبالغ المدفوعة وتعرض هذا المجموع بطريقة ما، صحيح؟

<?php
  $sum+= $o->payed;
?>

لا يفترض ان تحمل ملفات العرض اي منطق من هذا الشكل. لما لا نقوم مثلا بتعريف تابع ما يقوم بكل هاته العملية من اجلنا.

نقوم بتجميع كامل قيم payed من تحويلات هذا الشهر، ثم نطبق الوظيفة array_sum لحساب هذا المجموع.

class Operation extends Model {
  ..

  public function sumOftransactionsOfThisMonth()
  {
       return array_sum( $this->transactionsOfThisMonth()->pluck('payed') );
  }

}

لاحظ أننا استعملنا وظيفتنا السابقة.

ثم سيمكننا استدعاء هاته الوظيفة اينما شئنا كـ:

@foreach ($operation as $op )

     {{ $op->sumOftransactionsOfThisMonth() }}

ناتج الشيفرة:

@foreach ($operation as $op )
   @if($op->doctor->id == 1) @continue @endif
       <h5> 
           <label>
              <img src="/images/Arrow.svg" alt="clock">
           </label>
           <a href="projects/{{ $op->project->id }}">
              {{ $op->project->name }}
           </a>
       </h5> 

        @foreach ($op->transactions->where('created_at', '=', $time ) as $o )
        <h5>
            {{-- <label><img src="/images/money.svg" alt="clock"></label> --}}
            💵 المبلع المدفوع :<span> EGP {{ $o->payed }}</span>  
        </h5>
       @endforeach
@endforeach

 

  • 0
نشر (معدل)
بتاريخ 14 دقائق مضت قال Adnane Kadri:

هل حاولت استعمال التابع whereMonth هنا أيضا؟

مثلا:


$op->transactions->whereMonth('created_at', now()->month )->get()

لا تنسى تنفيذ الاستعلام عن طريق التابع get. يحتمل ان يكون هو مسبب المشكلة التي تحاول تفاديها:

كملاحظات أخرى،

من غير المقترح كتابة استعلامات قواعد بيانات في مكان غير النماذج Models. فهو تطبيق غير جيد ويضفي على الشيفرة الكثير من مشاكل عدم قابلية التوسع والقراءة ونظافة الشيفرة وغيرها.

ان كنت تحاول جلب التحويلات الخاصة بعملية ما في هذا الشهر فسيكفيك تعريفها ضمن ملف النموذج واستعمالها بشكل عادي في ملف العرض:


class Operation extends Model {
  ..

  public function transactionsOfThisMonth()
  {
       return $this->transactions->whereMonth('created_at' ,now()->month)->get();
  }

}

ثم سيسعك استعمالها بشكل عادي كـ:


@foreach($op->transactionsOfThisMonth() as $t )

ثالثا، لما تقوم بوضع الشيفرة كاملة داخلة عبارة شرطية if، لما لا تستعمل فقط متغير القالب continue في حالة تحقق الشرط وفقط؟


@foreach ($operation as $op )
   @if($op->doctor->id == 1) @continue @endif
       <h5> <label><img src="/images/Arrow.svg" alt="clock"></label> اســـــم الـحــالــه ->
                    <a href="projects/{{ $op->project->id }}">{{
                        $op->project->name }}</a>
                    </h6>

                    @foreach ($op->transactions->where('created_at', '=', $time ) as $o )
                    <h5>
                        {{-- <label><img src="/images/money.svg" alt="clock"></label> --}}
                        💵 المبلع المدفوع :<span> EGP {{ $o->payed }}</span>
                       
                        <?php
                    $sum+= $o->payed;
                ?>
                        </h6>
                        @endforeach
@endforeach

نفس الشيء بالنسبة للمتغير sum، افترض أنك تقوم بتجميع كامل المبالغ المدفوعة وتعرض هذا المجموع بطريقة ما، صحيح؟


<?php
  $sum+= $o->payed;
?>

لا يفترض ان تحمل ملفات العرض اي منطق من هذا الشكل. لما لا نقوم مثلا بتعريف تابع ما يقوم بكل هاته العملية من اجلنا.

نقوم بتجميع كامل قيم payed من تحويلات هذا الشهر، ثم نطبق الوظيفة array_sum لحساب هذا المجموع.


class Operation extends Model {
  ..

  public function sumOftransactionsOfThisMonth()
  {
       return array_sum( $this->transactionsOfThisMonth()->pluck('payed') );
  }

}

لاحظ أننا استعملنا وظيفتنا السابقة.

ثم سيمكننا استدعاء هاته الوظيفة اينما شئنا كـ:


@foreach ($operation as $op )

     {{ $op->sumOftransactionsOfThisMonth() }}

ناتج الشيفرة:


@foreach ($operation as $op )
   @if($op->doctor->id == 1) @continue @endif
       <h5> 
           <label>
              <img src="/images/Arrow.svg" alt="clock">
           </label>
           <a href="projects/{{ $op->project->id }}">
              {{ $op->project->name }}
           </a>
       </h5> 

        @foreach ($op->transactions->where('created_at', '=', $time ) as $o )
        <h5>
            {{-- <label><img src="/images/money.svg" alt="clock"></label> --}}
            💵 المبلع المدفوع :<span> EGP {{ $o->payed }}</span>  
        </h5>
       @endforeach
@endforeach

 

تم حل المشكله
الحل كان يجب ازاله الشرط
 

->where('created_at', '=', $time )

وتحديد الشهر من $query
رغم بساطه الحل الا اننى اضعت وقت كثير فيها
مازلنا في بدايات التعلم اشكرك على المعلومات والملاحظات وساعمل على تطبقها
شكرا لك

تم التعديل في بواسطة أحمد مصطفى كامل

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...