Laravel-datatables: كيف يمكنني تعيين المتغير الشامل لجميع الصفوف.

تم إنشاؤها على ٤ يوليو ٢٠١٧  ·  16تعليقات  ·  مصدر: yajra/laravel-datatables

ملخص المشكلة أو طلب الميزة

أحتاج إلى تعيين متغير واحد عند كل تكرار لجدول البيانات لاستخدامه جميعًا وظيفة addColumn () و editColumn ().

مقتطف رمز المشكلة

شيء مثل
""
إرجاع جداول البيانات :: من ($ users)
-> setGlobal (الوظيفة ($ user) {
الحالة $ = getUserStatus ($ user-> id) ؛
})
-> addColumn ("الحالة" ، الوظيفة ($ المستخدم) {
// return getUserStatus ($ user-> id) ؛
إرجاع الحالة $؛
}) ؛
-> editColumn ('is_approved'، function ($ user) {
// return getUserStatus ($ user-> id)؟ خطأ صحيح؛
العودة (الحالة $)؟ خطأ صحيح؛


so, each time I don't need to call this **getUserStatus($user->id)** function.
<!--
If applicable, please include a copy of your code
which triggers the suspected bug.

You may use the markdown php code tags to format your paste:

```php
$params = ['foo'];

->

تفاصيل النظام

  • نظام التشغيل
  • إصدار PHP
  • إصدار Laravel
  • نسخة Laravel-Datatables
question

التعليق الأكثر فائدة

عالمي؟ مجرد تمرير المتغير عند الإغلاق؟

$status = getUserStatus($user->id);

return Datatables::of($users)
->addColumn('status', function ($user) use ($status) {
  return $status;
});

ال 16 كومينتر

عالمي؟ مجرد تمرير المتغير عند الإغلاق؟

$status = getUserStatus($user->id);

return Datatables::of($users)
->addColumn('status', function ($user) use ($status) {
  return $status;
});

أريد تغيير الحالة في كل تكرار
لكل مستخدم يجب أن يتغير.

return Datatables::of($users) ->setGlobal(function ($user){ //for $user->id = 1 //status = true //for $user->id = 2 // status = false **$status** = **getUserStatus($user->id)**; }) ->addColumn('status', function ($user) { // return getUserStatus($user->id); return $status; }); ->editColumn('is_approved', function ($user) { //return getUserStatus($user->id) ? true : false; return ($status) ? true : false;

يرجى عدم إغلاق المشكلة قبل مراجعة المطور.

إذا كنت تريده في كل تكرار فهو ليس عالميًا .

->addColumn('status', function ($user) {
    return getUserStatus($user->id);
});
->addColumn('status', function ($user) {
    return getUserStatus($user->id);
})
->editColumn('xyz', function ($user) {
    return getUserStatus($user->id);
});

لكل عمود إضافة أو تحرير ، أحتاج إلى استدعاء نفس الوظيفة. سيؤدي ذلك إلى إجراء استدعاء لاستعلام MySql ، لذلك إذا كان لدي 5 أعمدة باستخدام نفس الوظيفة ، ففي تكرار واحد ، نفس استدعاء استعلام MySql لمدة 5 مرات ولعدد 1000 سجل سيكون 1000 * 5 = 5000 استعلام مكرر.

إذا كنت أستخدم الترحيل ، فعندئذٍ أيضًا بحد أدنى 20 سجلًا 20 * 5 = 100 استعلام مكرر.

استخدم التحميل الحثيث إذا كنت تريد حل مشكلات N + 1.

شاهد هذا العرض التوضيحي للمرجع: https://datatables.yajrabox.com/relation/belongs-to

أو استخدم عبارات الانضمام وقم بتضمين الحالة في استعلامك.

https://datatables.yajrabox.com/fluent/joins

$assignments = DB::table('assignments as a')
        ->when($round_id != "" || $round_id != NULL, function ($query) use ($round_id) {
            return $query->where('a.round_id', '=', $round_id);
        })
        ->leftJoin('rounds as r', 'a.round_id', '=', 'r.id')
        ->leftJoin('surveys as su', 'a.id', '=', 'su.assignment_id')
        ->leftJoin('projects as p', 'r.project_id', '=', 'p.id')
        ->leftJoin('sites as s',  'a.site_id', '=', 's.id')
        ->leftJoin('fieldreps as f', 'a.fieldrep_id', '=', 'f.id')
        ->leftJoin('chains as ch','p.chain_id','=','ch.id')
        ->leftJoin('clients as c','ch.client_id','=','c.id')
        ->when(is_string($status) && $status != "", function ($query) use ($status, $current_date) {
            if($status == 'late'){
                return $query->where(function ($query) use ($current_date) {
                    $query->where(function ($query)  {
                        $query->where(DB::raw('IFNULL( DATE_FORMAT(a.deadline_date,"%Y-%c-%e"), DATE_FORMAT(r.deadline_date,"%Y-%c-%e"))'), '<', DB::raw('CURDATE()'));
                    })
                    ->where(function ($query) use ($current_date) {
                        $query->where('a.is_scheduled', '=', true)
                        ->where('a.is_reported', '=', false)
                        ->where('a.is_partial', '=', false);
                    });
                });
            }else if($status == 'scheduled'){
                return $query->where(function ($query) use ($current_date) {
                    $query->where(function ($query)  {
                        $query->where(DB::raw('IFNULL( DATE_FORMAT(a.deadline_date,"%Y-%c-%e"), DATE_FORMAT(r.deadline_date,"%Y-%c-%e"))'), '>=', DB::raw('CURDATE()'));
                    })
                    ->where(function ($query) use ($current_date) {                     
                        $query->where('a.is_scheduled', '=', true)
                        ->where('a.is_reported', '=', false)
                        ->where('a.is_partial', '=', false);
                    });
                });
            }
            else if($status == 'pending'){
                return $query->leftJoin('assignments_offers as ao', function($join)
                {
                    $join->on('a.id', '=', 'ao.assignment_id');
                })
                ->where('a.is_scheduled', '=', false)
                ->where(DB::raw('(SELECT count(id) as offer_count FROM assignments_offers where assignment_id = a.id and is_accepted is null)'), '<=', '0')
                ->groupBy('a.id');
            }else if($status == 'offered'){
                return $query->leftJoin('assignments_offers as ao', function($join)
                {
                    $join->on('a.id', '=', 'ao.assignment_id');
                })
                ->where(['a.is_scheduled' => false, 'a.is_offered' => true])->where(['ao.is_accepted' => NULL])
                ->groupBy('ao.assignment_id');
            }else if($status == 'reported'){
                return $query->where(['a.is_reported' => true, 'is_approved' => false]);
            }else if($status == 'partial'){
                return $query->where('a.is_partial', true);
            }else if($status == 'completed' || $status == 'approved'){
                return $query->where('a.is_approved', true);
            }
        })
        ->select([
            'a.id',
            'a.fieldrep_id',
            'a.deadline_date',
            'a.is_scheduled',
            'a.is_reported',
            'a.is_partial',
            'a.is_offered',
            'a.is_approved',
            'c.client_logo',
            'p.id as project_id',
            'p.project_name',
            'r.id as round_id',
            'r.round_name',
            's.site_code',
            's.site_name',
            's.city',
            's.state',
            's.zipcode',
            'su.id as survey_id',
            DB::raw("CONCAT(IFNULL( DATE_FORMAT(a.schedule_date,'%d %b %Y'), DATE_FORMAT(r.schedule_date,'%d %b %Y')), ' ' , IFNULL(TIME_FORMAT(a.start_time, '%h:%i %p'), TIME_FORMAT(r.start_time,'%h:%i %p'))) as assignment_scheduled"),
            DB::raw("CONCAT(IFNULL( DATE_FORMAT(a.deadline_date,'%d %b %Y'), DATE_FORMAT(r.deadline_date,'%d %b %Y')), ' ' , IFNULL(TIME_FORMAT(a.start_time, '%h:%i %p'), TIME_FORMAT(r.deadline_time,'%h:%i %p'))) as assignment_end"),
            DB::raw('CONCAT(f.first_name," ",f.last_name) as schedule_to'),
            DB::raw('(select COUNT(id) as offer_count from assignments_offers where assignment_id = a.id and is_accepted is null group by assignment_id) as offer_count'),
            ]);

الاستعلام هذا معقد للغاية. لا تعتقد أن التحميل الحريص سيكون ممكنًا

لاستخدام الدالتين getXYZ و setXYZ داخل إضافة العمود وتعديله ، نحتاج إلزاميًا إلى كائن من Eloquent.

حسنًا ، لم أكن أتوقع هذا الاستعلام المعقد. ^ _ ^

قد تفكر في استخدام ذاكرة التخزين المؤقت بعد ذلك؟ إذا لم تتغير الحالة كثيرًا ، فيمكنك أيضًا تعيينها لفترة زمنية أطول.

-- يحرر --
ربما شيء مثل:
"" php
دالة getUserStatus ($ id) {
return Cache :: remember ('user.status.'. $ id، 1، function ($ id) {
عودة الحالة :: find ($ id)؛
}) ؛
}

->setGlobal(function ($user){
//for $user->id = 1 //status = true
//for $user->id = 2 // status = false
$status = getUserStatus($user->id);
})

آمل أن يكون هناك شيء مثل هذا

لست متأكدًا حقًا من اقتراحك setGlobal لأنك ما زلت بحاجة إلى التكرار على كل مستخدم لتتمكن من جلب الحالة ومن ثم سيستمر تنفيذ استدعاء متعدد الوظائف ..

أنا أبحث حقًا عن طريقة للتخلص من مئات الاستعلامات المكررة. لمجرد استدعاء getXYZ و setXYZ في أكثر من عمود واحد.

لدي أيضًا نفس المشكلة وأريد استخدام متغير عام (مشترك) حتى أتمكن من استخدامه لكل تكرار كمتغير مشترك
ruchisheth إذا حصلت على شيء ، فيرجى مشاركة إجابتك

شكرا للمساعدة مقدما.. :)

ruchisheth نفسه

rajanjain و haratmalli ليس لدي أي حل لهذا.

مرحبا هل حاولت في العمود الأول لوضع

data-> Statues = 4 ؛

نسميها على رد الاتصال الثاني؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات