Столбцы данных Yajra на стороне сервера: [] манипуляции

Я хочу манипулировать данными яджры

columns:[
    { data: 'fname', name: 'members.fname' },
    { data: 'fname', name: 'employees.emp_fname' }
]

используя функцию рендеринга, показанную ниже, и это не сработало. Ошибка в операторе возврата. Таблица не отображает никаких данных. Я просто не мог найти подходящего решения. Я уже использовал alias и addColumn и работает хорошо, но проблема в том, что он не позволяет выполнять поиск по именам. Вот почему я придумал такую ​​строку кода, потому что она, возможно, позволит выполнить поиск, если она работает. Пожалуйста, помогите с этим. Спасибо.

p3bills_table = $('#table-p3bills').DataTable({
    processing: true,
    serverSide: true,
    order: [
        [
            1, "asc"
        ]
    ],
    ajax: {
        url: "{{ route('get.p3bills') }}",
    },
    columns: [
        { data:'id', name:'p3bills.id' },
        { data:'id', name:'p3bills.id', orderable: true },
        { data:'p3loan_id', name:'p3loan_id' },
        { data:'schedule', name:'p3bills.schedule' },
        {
            render: function (data, type, full, meta) {
                if (full.member_id == 0) {
                    return data:'fname', name: 'employees.emp_fname';
                } else {
                    return data:'fname', name: 'members.fname';
                }
            }
        },
        { data:'lname', name:'members.lname' },
        { data:'mname', name:'members.mname' }
    ]
});

Контроллер

 public function getP3bills(){

    $p3bills = P3bill::leftJoin('p3payments', 'p3payments.p3bill_id', '=', 'p3bills.id')
                     ->leftJoin('members', 'members.id', '=', 'p3bills.member_id')
                     ->leftJoin('employees', 'employees.id', '=', 'p3bills.employee_id')
                     ->select(['members.id','members.lname','members.fname','members.mname','members.extension','employees.id','employees.emp_lname','employees.emp_fname','employees.emp_mname','employees.emp_extension','p3bills.*','p3payments.payment_amount','p3payments.or_number'])
                     ->selectRaw(  '('.
            'CASE'.
            ' WHEN members.id=0 THEN employees.emp_fname'.
            ' ELSE members.fname'.
            ' END'.
        ') AS person_name' );
    }

person Eli    schedule 05.04.2020    source источник


Ответы (2)


Вместо этого вам нужно справиться с этой ситуацией на сервере.

Я предполагаю, что вы используете реализацию службы Yajra DataTables.

Вы можете использовать инструкцию CASE, чтобы определить, что будет возвращено на основе на вашем состоянии.

Например:

/**
 * Get query source of dataTable.
 *
 * @param \App\Models\User $model
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function query(User $model)
{
    $query = $model->newQuery()
        ->select()
        ->selectRaw(
            '('.
                'CASE'.
                ' WHEN members.id=0 THEN employees.emp_fname'.
                ' ELSE members.fname'.
                ' END'.
            ') AS person_name'
        );

    return $query;
}

Чтобы включить поиск в этом новом столбце, вам нужно будет вызвать метод filterColumn() .

В зависимости от вашей версии Laravel DataTables и выбранного метода реализации ваш код может отличаться. Например, приведенный ниже код предназначен для Laravel DataTables v9 с использованием реализации службы.

/**
 * Build DataTable class.
 *
 * @param  mixed  $query Results from query() method.
 * @return \Yajra\DataTables\DataTableAbstract
 */
public function dataTable($query)
{
    return datatables($query)
        ->filterColumn('person_name', function($query, $keyword) {
            $query->whereRaw(
                '('.
                    'CASE'.
                    ' WHEN members.id=0 THEN employees.emp_fname'.
                    ' ELSE members.fname'.
                    ' END'.
                ') ILIKE ?', 
                [ '%' . sql_escape_like($keyword) . '%' ]
            );
        });
}

Также я использую следующий вспомогательный метод для экранирования специальных символов в предложении LIKE / ILIKE.

if (! function_exists('sql_escape_like')) {
    /**
     * Escape special characters for SQL query with LIKE condition.
     *
     * @param  string $value
     * @return string
     */
    function sql_escape_like($value)
    {
        return str_replace(['\\', '%', '_'], ['\\\\', '\\%', '\\_'], $value);
    }
}

Затем используйте { data:'person_name' } в качестве определения столбца в коде инициализации JavaScript DataTables.

person Gyrocode.com    schedule 12.04.2020
comment
Я еще не пробовал это. Попробую позже, когда вернусь домой. Выглядит хорошо. Но пару дней назад я попытался использовать псевдоним, проблема в том, что имена не могут быть найдены в таблице данных, потому что имя, используемое в псевдониме, не существует в базе данных, в данном случае person_name. Я надеюсь, что с этим кодом все идет хорошо. Я сообщу вам обновления позже. - person Eli; 17.04.2020
comment
Это работает, когда имена ищутся в таблицах данных? - person Eli; 17.04.2020
comment
Я отредактировал свой пост и показал свою функцию контроллера, я применил ваш код, и он не отображает в таблице employee.emp_fname, только members.fname. И поиск не работает. - person Eli; 18.04.2020
comment
@Eli, вы заменили определение столбца на { data: 'person_name' }? - person Gyrocode.com; 18.04.2020
comment
Да сэр. {data: 'person_name', name: 'person_name'}, поиск не работает, и я не знаю, почему он не показывает сотрудников.emp_fname - person Eli; 19.04.2020
comment
@Eli, я добавил подробностей, чтобы включить поиск. Также я подозреваю, что причина, по которой employees.emp_fname не отображается, заключается в том, что условие members.id=0 неверно. Проверьте свое состояние, может быть members.id IS NULL? - person Gyrocode.com; 19.04.2020
comment
это рабочий человек. Спасибо большое. и это на самом деле p3bills.member_id = 0, это правильное условие. - person Eli; 20.04.2020
comment
как насчет того, чтобы я включил lname и mname? Нужно ли мне копировать часть selectRaw и создавать еще один filterColumn? или я могу просто манипулировать им в части CASE? - person Eli; 20.04.2020
comment
есть ошибка поиска регулярного выражения, сэр. также появляется всплывающее окно, подобное этому: Предупреждение DataTables: table id = table-p3bills-all - Ошибка Ajax. Дополнительную информацию об этой ошибке см. На странице datatables.net/tn/7. - person Eli; 29.04.2020

Как предлагает Gyrocode.com, проверьте статус в контроллере и визуализируйте элемент с помощью псевдостолбца. В контроллере вы можете сделать это,

$bills = Bill::all(); // Your Model Query goes here

return datatables($bills)
        ->addColumn('fname', function ($bill) {
            if ($bill->member_id == 0) {
                return $bill->employee->fname; // Employee First Name
            }

            return $bill->member->fname; // Member First Name
        })
        ->toJson();

а в JavaScript вы можете использовать его как,

{ data: 'fname' }
person linktoahref    schedule 17.04.2020
comment
Позволяет ли этот код искать имена? Coz Я читал в yajra, что определенные имена в функции addColumn не могут быть найдены. - person Eli; 17.04.2020
comment
Добавить столбец является псевдостолбцом и не позволяет выполнять поиск по ним. Подробнее здесь github.com/yajra/laravel-datatables/issues/139 - person linktoahref; 17.04.2020
comment
@linktoahref, у вас есть хорошее альтернативное решение, но поиск не работает. Если вы используете filterColumn('fname', function ($query, $keyword){ }, вы сможете настроить критерии поиска. - person Gyrocode.com; 17.04.2020