2015-11-09 2 views
0

У меня возникла проблема, когда я запрашиваю базу данных и получаю нулевые результаты, я получаю пустой массив, хотя хочу бросить «ModelNotFoundException». Вот мой пример код:Laravel возвращает пустой массив вместо исключения со статусом 200

<?php 
#App\Http\Controller\MainController 
namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use Illuminate\Database\Eloquent\ModelNotFoundException; 

use App\Http\Requests; 
use App\Http\Controllers\Controller; 
use App\Demo; 
use DB; 


class MainController extends Controller 
{ 

    public function getTagRecords($tag, $limit) 
    { 
    try{ 
     $results = Demo::getRecordsByTag($tag, $limit); 
    }catch (Illuminate\Database\Eloquent\ModelNotFoundException $e){ 
     return response()->json(['message'=>'hello there error'], 404); 
    } 
    return $results; 
    } 

Я посылаю запрос через AJAX и хочу вернуть сообщение об ошибке, и статус. Я не модифицировал класс Handler.

Вот код модели:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 
use Illuminate\Database\Eloquent\ModelNotFoundException; 
use DB; 

class Demo extends Model 
{ 

    public static function getRecordsByTag($tag, $limit) 
    { 
     $params = [ 
      'tag' => $tag, 
      'limit' => $limit, 
     ]; 

     return DB::select("SELECT d.idDemo, d.idUsuario, u.Referencia, d.Uri_fichero, 
      (SELECT Nombre FROM Edad_voz WHERE IdEdad_voz = d.IdEdad_voz) Edad_voz, 
      (SELECT Nombre FROM Tono_voz WHERE idTono_voz = d.idTono_voz) Tono_voz, 
      (SELECT Idioma_Variante FROM Idioma WHERE idIdioma = d.idIdioma) Idioma, 
      (SELECT Nombre FROM Genero WHERE idGenero = d.idGenero) Genero 

      FROM Demo AS d 
      INNER JOIN logs AS l ON d.idDemo = l.idElemento 
      INNER JOIN usuario AS u ON d.idUsuario = u.idUsuario 

      WHERE 

      l.accion = :tag AND 
      l.procesado = '0' 

      ORDER BY idDemo 

      LIMIT :limit;", $params); 
    } 
} 
+0

Можете ли вы поделиться с нами кодом 'Demo :: getRecordsByTag ($ tag, $ limit)? – infinity

ответ

1

Я хотел бы переписать getRecordsByTag функцию, чтобы заботиться, если это так:

$result = DB::select("SELECT d.idDemo, d.idUsuario, u.Referencia, d.Uri_fichero, 
     (SELECT Nombre FROM Edad_voz WHERE IdEdad_voz = d.IdEdad_voz) Edad_voz, 
     (SELECT Nombre FROM Tono_voz WHERE idTono_voz = d.idTono_voz) Tono_voz, 
     (SELECT Idioma_Variante FROM Idioma WHERE idIdioma = d.idIdioma) Idioma, 
     (SELECT Nombre FROM Genero WHERE idGenero = d.idGenero) Genero 

     FROM Demo AS d 
     INNER JOIN logs AS l ON d.idDemo = l.idElemento 
     INNER JOIN usuario AS u ON d.idUsuario = u.idUsuario 

     WHERE 

     l.accion = :tag AND 
     l.procesado = '0' 

     ORDER BY idDemo 

     LIMIT :limit;", $params); 

    if (is_empty($result)) throw new ModelNotFoundException; 

    return $result; 

Так в основном: Если результат пуст бросить исключение. Этот контроллер не нуждается в каких-либо модификациях.

+0

Спасибо, за ответ. Я начал думать, что я должен просто вернуть пустой ответ независимо от того, что независимо от моей логики приложения. Хотя теперь я думаю - это должно зависеть от ситуации, и я могу решить, хочу ли я сделать исключение или вернуть пустой результат запроса. – naneri

0

сначала лучше удалить комментарий перед именами: #App\Http\Controller\MainController

вторых вы можете и должны проверить, если класс существует, а затем бросить исключение вручную

в зависимости от PHP версии вы используете, вы должны быть в состоянии сделать что-то вроде:

if (class_exists(Demo::class)) { 
    $results = Demo::getRecordsByTag($tag, $limit); 
} else { 
    // or you can throw an exception from here 
    // throw new Illuminate\Database\Eloquent\ModelNotFoundException('hello there error'); 
    return response()->json(['message'=>'hello there error'], 404); 
} 

UPDATE: Я просто видел, что вы предоставили код для вызова метода getRecordsByTag(). Я бы сказал, добавьте документацию в метод, чтобы объяснить, что он может вернуть пустой ответ, например. array(), и это зависит от того, как вызывающий абонент решает, как обращаться с конкретным случаем, оставляя вашу модель чистой и без бизнес-логики. Таким образом, в вызывающем устройстве проверьте, является ли результат пустой коллекцией, и если это случай, выведите исключение, поскольку это определенная логика, необходимая для его функционирования.

if (count($results = Demo::getRecordsByTag($tag, $limit)) === 0) { 
    throw new RecordNotFoundException("Tag: $tag was not found in the Demo table"); 
} 
+0

Это не пространство имен, это имя файла. Пространство имен находится справа. Также - почему я должен проверить, существует ли класс? Я ищу, если есть какие-либо записи с параметрами и вы хотите исключить исключение, если запрос возвращает 0 записей, подобных методу -> findOrFail. – naneri

+0

да, простите, проигнорируйте комментарий относительно строки над пространством имен, моя ошибка. Если 'Demo :: getRecordsByTag()' выдает исключение, вы должны уловить его, если он имеет тот же тип 'ModelNotFoundException', если запрос, хотя и возвращает 0, вы должны проверить это и бросить/вернуть самостоятельно. – infinity

+0

Итак, если метод возвращает пустой массив, я должен сам выбросить ошибку? – naneri

Смежные вопросы