2015-09-26 7 views
1

У меня есть запрос, который отлично работает в PMA, и я пытаюсь преобразовать его в Eloquent, но мне что-то не хватает. Здесь SQL-запрос:laravel 5.1 eloquent query

SELECT t1.* FROM ppr__child_absence t1 
LEFT JOIN ppr__children t3 ON t3.idcode=t1.child_idcode 
WHERE t1.id = (SELECT t2.id FROM ppr__child_absence t2 
    WHERE t2.child_idcode = t1.child_idcode 
    ORDER BY t2.id DESC LIMIT 1) 
AND t3.deleted_at IS NULL 
AND $input BETWEEN start AND stop; 

и ГЭК мой красноречивый запрос:

$input = Request::all(); 
$pprs = 
    DB::table('ppr__child_absence') 
    ->join('ppr__children', function($join) { 
     $join->on('ppr__children.idcode', '=', 'ppr_children_absence.child_idcode') 
      ->where('ppr__child_absence.child_idcode', '=', DB::raw('SELECT t2.id FROM ppr__child_absence t2 
       WHERE t2.child_idcode = ppr__child_absence.child_idcode 
       ORDER BY t2.id DESC LIMIT 1'));}) 
      ->whereNull('ppr__children.deleted_at') 
      ->whereBetween($input, array('ppr_children_absence.start','ppr_children_absence.stop'))->get(); 

Я постоянно получаю ошибку: ErrorException в Grammar.php линии 58: strtolower() ожидает параметр 1 для строки, массив.

Может ли кто-нибудь здесь привести меня в правильном направлении? В основном пользователь имеет 1 ввод даты с datepicker и кнопку отправки, чтобы получить результат в соответствии с выбранной датой.

не работает запрос здесь с ошибкой, но никаких результатов

$input = Request::all(); 
    $pprs = DB::table('ppr__child_absence') 
      ->select('ppr__child_absence.*') 
      ->join('ppr__children', function($join) { 
      $join->on('ppr__children.idcode', '=', 'ppr__child_absence.child_idcode') 
       ->where('ppr__child_absence.id', '=', DB::raw('SELECT t2.id FROM ppr__child_absence t2 
        WHERE t2.child_idcode = ppr__child_absence.child_idcode 
        ORDER BY t2.id DESC LIMIT 1'));}) 
       ->whereNull('ppr__children.deleted_at') 
       ->where('ppr__child_absence.start', '<', $input['ppr_day']) 
       ->where('ppr__child_absence.stop', '>', $input['ppr_day'])->get(); 

ответ

1

$input = Request::all(); хранит все входные поля в массиве.

Вы используете ->whereBetween($input,...), и ожидается, что первым параметром whereBetween() будет строка (имя столбца таблицы), но вы передаете массив.

Вы не указали детали ввода. Предполагая, что вход содержит поле под названием «поле», вы должны использовать ->whereBetween($input['field'],...), а не

+0

спасибо! Я пропустил это, но есть еще кое-что. Я получаю ошибку SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «2015-09-26» в разделе «where». он пытается найти столбец и не признает, что это дата. Даже когда оно объявлено в файле модели. Имя поля поля ввода $ будет «ppr_day». – Merrant

+0

также добавил строку -> select ('ppr__child_absence. *') После DB :: table ('ppr__child_absence') – Merrant

0

Что вы, похоже, хотите, это не то, что предлагает метод whereBetween. При использовании whereBetween логика заключается в том, что вы хотите, чтобы заданное значение столбца находилось между двумя входными значениями. Пример в Laravel Query Builder Documentation выбирается так:

// the column 'votes' value should be between 1 and 100 
$users = DB::table('users')->whereBetween('votes', [1, 100]); 

То, что вы, кажется, хотят, чтобы убедиться, что входное значение между двумя различными значениями столбца. Вы можете сделать это при наличии двух отдельных условий:

->where('ppr_children_absence.start', '<', $input['value']) 
->where('ppr_children_absence.stop', '>', $input['value']) 

Это позволит убедиться, что $input['value']) между значениями столбцов в start и stop.

+0

Спасибо! Этот + маленький опечаток сделал трюк. Мне кажется, что он работает, не дает ошибок, но результат равен 0, даже если я получил некоторые данные в базе данных. – Merrant

+0

свалка запрос дал мне это ' «SELECT 'ppr__child_absence'. * От' ppr__child_absence' \t \t внутреннее объединение '' ppr__children' на ppr__children'.'idcode' = 'ppr__child_absence'.'child_idcode' \t \t и 'ppr__child_absence'.'id' =? \t \t где' ppr__children'.'deleted_at' является нулевым \t \t и 'ppr__child_absence'.'start' <? и ' ppr__child_absence'.'stop' >?" '' похоже, что необработанный запрос не выполняется или что? Почему он «?»? – Merrant

+0

Попробуйте использовать 'whereRaw' вместо' where', например '---> whereRaw ('t1.id = (SELECT t2.id FROM ppr__child_absence t2 WHERE t2.child_idcode = t1.child_idcode ORDER BY t2.id DESC LIMIT 1) ') '. – Bogdan