Я использую Laravel Yajra Datatables с полиморфными отношениями c. Проблема в том, что c заключается в том, что я не могу ни фильтровать таблицу, ни сортировать ее должным образом, потому что я заполнил ее разными значениями таблиц.
Таблица A "трансформируется" в таблицы B и C. Таким образом, он имеет столбец
morph_type и morph_id.
Таблицы B и C имеют общие столбцы, такие как:
id, код
, но также другие другие столбцы, такие как
B.name, B. фамилия, C .lastname, C .firstname
Поскольку фильтр не работает, я попытался реализовать Datatables filterColumn API. Но я не совсем знаю правильный путь к этому запросу. Вот мой sql (Postgresql):
$query = A::with('morphable')->select('*');
return Datatables::of($query)
->addColumn('code', function($row) {
return $row->morphable->code_pap;
})
->addColumn('name', function($row) {
if($row->morphable->name !== null){
return $row->morphable->name;
} else {
return $row->morphable->lastname;
}
})
->addColumn('surname', function($row) {
if($row->morphable->surname !== null){
return $row->morphable->surname;
} else {
return $row->morphable->firstname;
}
})
->filterColumn('name', function($query, $keyword) {
//I check $query it retruns "select * from A;" only.
// redefining $query does not change anything. I always get same query.
$sqlB = "CASE WHEN exists (select 1 from B where B.name like ?)";
$sqlC = "CASE WHEN exists (select 1 from C where C.lastname like ?)";
$query->whereRaw($sqlB, ["%{$keyword}%"])->orWhereRaw($sqlC, ["%{$keyword}%"]);
}) //same thing for firstname and surname ;
Конечно, sql не работает. Я получаю ошибку рядом с «выберите» и рядом с «или». Итак, как правильно сделать это с / без sql raw. Спасибо