Laravel 5.6: Как сделать App \ sys_data :: where ($ moreWhere) -> paginate (10);Работа? - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть три разных столбца в моей базе данных.Я хочу разрешить пользователю получать данные из этих столбцов в зависимости от его потребностей.Пользователь может выбрать выборку всех данных из всех столбцов или пользователь может выбрать конкретную информацию о столбце.

$moreWhere="";
if($request->status != 'all')
    $moreWhere="['status', '=', '$request->status'],";
if($request->category != 'all')
    $moreWhere = $moreWhere . "['cat', '=', '$request->cat'],";
if($request->type != 'all')
    $moreWhere = $moreWhere . "['type', '=', '$request->type']";

$moreWhere = '[' . $moreWhere . ']';

$showData = sys_data::where($moreWhere)->wherebetween('date', [$request->from_date, $request->to_date])->paginate(10);

У меня проблема в том, что, когда я передаю переменную $ moreWhere в предложение «where»я получаю ошибку.

Это дает мне следующую ошибку.

Illuminate \ Database \ QueryException (42S22)
SQLSTATE[42S22]: Column not found: 1054 Unknown column 
'[['status', '=', 'Yes'],['cat', '=', 'Food'],['type', '=', 'Free']]' 
in 'where clause' (SQL: select count(*) as aggregate 
from `sys_data` where `[['status', '=', 'Yes'],['cat', '=', 'Food'],['type', '=', 'Free']]` = `` 
and `date` between 2018-09-01 and 2018-09-03)

Если я вручную добавлю

[['status', '=', 'Yes'],['cat', '=', 'Food'],['type', '=', 'Free']]

в качестве аргумента "где", например, после

sys_data::where([['status', '=', 'Yes'],['cat', '=', 'Food'],['type', '=', 'Free']])

, тогда он будет работать как шарм.

Однако то же самое, что сохраняется в переменной и присваивается «где», просто не работает.Я что-то упустил?

Извините, я новичок в Laravel и программировании, поэтому любая помощь будет принята с благодарностью.Опять же, я использую Laravel 5.6, если это актуально здесь.

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы можете добавить, где условие в объекте модели, как это

$showData = sys_data::wherebetween('date', [$request->from_date, $request->to_date]);
if($request->status != 'all')
$showData->where('status',$request->status);
if($request->category != 'all')
$showData->where('cat',$request->cat);
if($request->type != 'all');
$showData->where('type',$request->type);
$showData->get()->paginate(10);
0 голосов
/ 21 сентября 2018

Если вы хотите динамически добавлять операторы where в ваш запрос в зависимости от других настроек, вы можете либо начать запрос с переменной, либо добавить замыкание в вызове where.

Опция 1:

$query = sys_data::query();

if($request->status != 'all')
    $query->where('status', $request->status);
if($request->category != 'all')
    $query->where('cat', $request->cat);
if($request->type != 'all')
    $query->where('type', $request->type);

$query->wherebetween('date', [$request->from_date, $request->to_date])->paginate(10);

$showData = $query;

Вариант 2:

$showData = sys_data::where(function($query){
    if($request->status != 'all')
        $query->where('status', $request->status);
    if($request->category != 'all')
        $query->where('cat', $request->cat);
    if($request->type != 'all')
        $query->where('type', $request->type);

    return $query;
})->wherebetween('date', [$request->from_date, $request->to_date])->paginate(10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...