Laravel-datatables: بحث: استرداد السمة عبر المعرف

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

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

تم التأكيد على علاقة واحد لكثير من خلال تخزين معرف الكيان المالك في جدول العديد من الكيانات. على سبيل المثال: يدير المنسق مركزًا واحدًا أو عدة مراكز. بعد تعيين الأعمدة عبر منشئ html ، قمت بتحرير العمود coodinator_id وقمت بتطبيق طريقة وصول لاسترداد الاسم الكامل للمنسقين:

public function getFullNameAttribute()
{
    return $this->first_name . ", " . $this->last_name;
}

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

كيف يمكنني تحقيق ذلك؟

يرجى وصف مشكلتك / طلب الميزة هنا.

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

إذا كان ذلك ممكنًا ، يرجى تضمين نسخة من الكود الخاص بك الذي يؤدي إلى الخطأ المشتبه به. يمكنك استخدام علامات كود php لتنسيق اللصق الخاص بك:
<?php

namespace App\DataTables;
use Auth;
use App\Center;
use App\Coordinator;
use Yajra\Datatables\Services\DataTable;

class CentersDataTable extends DataTable
{
    // protected $printPreview  = 'path.to.print.preview.view';

    /**
     * Display ajax response.
     *
     * <strong i="13">@return</strong> \Illuminate\Http\JsonResponse
     */
    public function ajax()
    {
        return $this->datatables
            ->eloquent($this->query())
            ->editColumn('action', function ($center) {
                return '<a href="edit-center/'.$center->id.'" <i class="material-icons sideicons-tables">create</i>'; 
               // <a href="field-technician-delete/'.$user->id.'" <i class="material-icons sideicons-tables">delete</i>
            })
            ->editColumn('coordinator_id', function ($user) {
                return Coordinator::find($user->coordinator_id)->full_name;
                })
            ->editColumn('gps_lat', function ($center) {
                    return $center->gps_location ;
                })
            ->make(true);
    }

    /**
     * Get the query object to be processed by datatables.
     *
     * <strong i="14">@return</strong> \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder
     */
    public function query()
    {
        if(Auth::user()->hasRole('admin')){
        $centers = Center::query();
        return $this->applyScopes($centers);
        }
        else{
            $centers = Center::query()->where('coordinator_id',Auth::user()->userable->id);
            return $this->applyScopes($centers);
        }
    }

    /**
     * Optional method if you want to use html builder.
     *
     * <strong i="15">@return</strong> \Yajra\Datatables\Html\Builder
     */
    public function html()
    {
        return $this->builder()
             ->columns([
                'id' => ['title' => 'ID'],
                'center_name' => ['title' => 'Name'], 
                'gps_lat' => ['title' => 'Coordinates'],
                'contact_no' => ['title' => 'Contact Number'],
                'coordinator_id' => [
                            'title' => 'Coordinator',
                            'searchable' => true
                ],
                'created_at' => [ 'title' => 'Created'],
                 'updated_at' => ['title' => 'Updated'], 
                'action' => [
                             'data'           => 'action',
                            'name'           => 'action',
                            'render'         => null,
                            'orderable'      => false,
                            'searchable'     => false,
                            'exportable'     => false,
                            'printable'      => false
                             ]
             ])
             ->parameters([
                 'dom' => 'Bfrtip',
                 'buttons' => ['csv', 'excel', 'print','reload'],
             ]);
    }

    /**
     * Get columns.
     *
     * <strong i="16">@return</strong> array
     */
    private function getColumns()
    {
        return [
            'id',
            // add your columns
            'created_at',
            'updated_at',
        ];
    }

    /**
     * Get filename for export.
     *
     * <strong i="17">@return</strong> string
     */
    protected function filename()
    {
        return 'centers';
    }
}

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

  • نظام التشغيل: OS X El Capitan 10.11.5
  • إصدار PHP: 7.0.0
  • إصدار Laravel: 5.1.36 (LTS)
  • إصدار Laravel-Datatables: 6.11.5

يعتبر،

question

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

الحيلة التي يمكنك القيام بها هي إضافة كلا العمودين إلى js ولكنهما حتى يظل من الممكن البحث فيهما:

'last_name' => [
    'data' => 'coordinator.last_name',
    'visible' => false,
    'name' => 'coordinator.last_name',
],
'coordinator' => [
    'data' => 'coordinator',
    'name' => 'coordinator.first_name',
],

->addColumn('coordinator', function ($user) {
    return Area_Coordinator::find($user->area_coordinator_id)->full_name;
})

ال 3 كومينتر

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

حاولت تحميل حريصة ، وتعديلها حسب البرنامج التعليمي على موقعك. ومع ذلك ، فإن مشكلتي الآن هي أنني لا أقوم بتخزين الاسم الكامل للمنسقين ، بدلاً من الاسم الأول واسم العائلة بشكل منفصل. ما لدي حاليا:
استفسار

$centers = Center::query()->with('coordinator')->where('coordinator_id',Auth::user()->userable->id);
            return $this->applyScopes($centers);

الأعمدة

'first_name' => [
                'data' => 'coordinator.first_name',
                'name' => 'coordinator.first_name',
                            'title' => 'Coordinator',
                            'searchable' => true,
                ],

طريقة التحرير

->editColumn('first_name', function ($user) {
                return Area_Coordinator::find($user->area_coordinator_id)->full_name;
                })

يمكنني البحث عن طريق الاسم الأول للمنسقين ، ولكن بما أنني أريد البحث بهذا الاسم ، فهل هناك طريقة لدمج كلاهما في عمود واحد؟ أو بدلاً من ذلك ، قم بتطبيق طريقة الموصِّل الخاصة بي ، أم ينبغي عليَّ فقط تضمين عمود الاسم الأخير في جدول البيانات؟

يعتبر،

الحيلة التي يمكنك القيام بها هي إضافة كلا العمودين إلى js ولكنهما حتى يظل من الممكن البحث فيهما:

'last_name' => [
    'data' => 'coordinator.last_name',
    'visible' => false,
    'name' => 'coordinator.last_name',
],
'coordinator' => [
    'data' => 'coordinator',
    'name' => 'coordinator.first_name',
],

->addColumn('coordinator', function ($user) {
    return Area_Coordinator::find($user->area_coordinator_id)->full_name;
})
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات